diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index 8210f80fbb..08a5d44078 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -677,7 +677,7 @@
/area/rogue/indoors/vampire_manor)
"bG" = (
/obj/structure/fluff/wallclock/vampire,
-/obj/machinery/light/rogue/hearth/big_fireplace,
+/obj/machinery/light/rogue/wallfire/big_fireplace,
/turf/open/floor/rogue/hexstone,
/area/rogue/indoors/vampire_manor)
"bH" = (
diff --git a/code/datums/pollutants/foods.dm b/code/datums/pollutants/foods.dm
index c54f70bf13..0b669b0051 100644
--- a/code/datums/pollutants/foods.dm
+++ b/code/datums/pollutants/foods.dm
@@ -112,9 +112,9 @@
name = "cooked sausage"
scent = "cooked sausage"
-/datum/pollutant/food/sausage
- name = "cooked sausage"
- scent = "cooked sausage"
+/datum/pollutant/food/wiener
+ name = "cooked wiener"
+ scent = "cooked wiener"
/datum/pollutant/food/fried_cabbage
name = "fried cabbage"
diff --git a/code/game/objects/lighting/_base_roguelight.dm b/code/game/objects/lighting/_base_roguelight.dm
new file mode 100644
index 0000000000..bdb1889341
--- /dev/null
+++ b/code/game/objects/lighting/_base_roguelight.dm
@@ -0,0 +1,185 @@
+/obj/machinery/light/rogue
+ icon = 'icons/roguetown/misc/lighting.dmi'
+ brightness = 8
+ nightshift_allowed = FALSE
+ fueluse = 60 MINUTES
+ bulb_colour = "#f9ad80"
+ bulb_power = 1
+ var/datum/looping_sound/soundloop = /datum/looping_sound/fireloop
+ pass_flags = LETPASSTHROW
+ flags_1 = NODECONSTRUCT_1
+ var/cookonme = FALSE
+ var/crossfire = TRUE
+ var/can_damage = FALSE
+
+/obj/machinery/light/rogue/Initialize()
+ if(soundloop)
+ soundloop = new soundloop(src, FALSE)
+ soundloop.start()
+ GLOB.fires_list += src
+ if(fueluse)
+ fueluse = fueluse - (rand(fueluse*0.1,fueluse*0.3))
+ update_icon()
+ seton(TRUE)
+ . = ..()
+
+/obj/machinery/light/rogue/weather_trigger(W)
+ if(W==/datum/weather/rain)
+ START_PROCESSING(SSweather,src)
+
+/obj/machinery/light/rogue/OnCrafted(dirin)
+ . = ..()
+ can_damage = TRUE
+ burn_out()
+
+/obj/machinery/light/rogue/examine(mob/user)
+ . = ..()
+ if(Adjacent(user))
+ if(fueluse > 0)
+ var/minsleft = fueluse / 600
+ minsleft = round(minsleft)
+ if(minsleft <= 1)
+ minsleft = "less than a minute"
+ else
+ minsleft = "[round(minsleft)] minutes"
+ . += span_info("The fire will last for [minsleft].")
+ else
+ if(initial(fueluse) > 0)
+ . += span_warning("The fire is burned out and hungry...")
+
+
+/obj/machinery/light/rogue/extinguish()
+ if(on)
+ burn_out()
+ new /obj/effect/temp_visual/small_smoke(src.loc)
+ ..()
+
+
+
+/obj/machinery/light/rogue/burn_out()
+ if(soundloop)
+ soundloop.stop()
+ if(on)
+ playsound(src.loc, 'sound/items/firesnuff.ogg', 100)
+ ..()
+ update_icon()
+
+/obj/machinery/light/rogue/update_icon()
+ if(on)
+ icon_state = "[base_state]1"
+ else
+ icon_state = "[base_state]0"
+
+/obj/machinery/light/rogue/update()
+ . = ..()
+ if(on)
+ GLOB.fires_list |= src
+ else
+ GLOB.fires_list -= src
+
+/obj/machinery/light/rogue/Destroy()
+ QDEL_NULL(soundloop)
+ GLOB.fires_list -= src
+ . = ..()
+
+/obj/machinery/light/rogue/fire_act(added, maxstacks)
+ if(!on && ((fueluse > 0) || (initial(fueluse) == 0)))
+ playsound(src.loc, 'sound/items/firelight.ogg', 100)
+ on = TRUE
+ update()
+ update_icon()
+ if(soundloop)
+ soundloop.start()
+ addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
+ return TRUE
+
+/obj/proc/trigger_weather()
+ if(!QDELETED(src))
+ if(isturf(loc))
+ var/turf/T = loc
+ T.trigger_weather(src)
+
+/obj/machinery/light/rogue/Crossed(atom/movable/AM, oldLoc)
+ ..()
+ if(crossfire)
+ if(on)
+ AM.fire_act(1,5)
+
+/obj/machinery/light/rogue/spark_act()
+ fire_act()
+
+/obj/machinery/light/rogue/attackby(obj/item/W, mob/living/user, params)
+ if(cookonme)
+ if(istype(W, /obj/item/reagent_containers/food/snacks))
+ if(istype(W, /obj/item/reagent_containers/food/snacks/egg))
+ to_chat(user, span_warning("I wouldn't be able to cook this over the fire..."))
+ return FALSE
+ var/obj/item/A = user.get_inactive_held_item()
+ if(A)
+ var/foundstab = FALSE
+ for(var/X in A.possible_item_intents)
+ var/datum/intent/D = new X
+ if(D.blade_class == BCLASS_STAB)
+ foundstab = TRUE
+ break
+ if(foundstab)
+ var/prob2spoil = 33
+ if(user.mind.get_skill_level(/datum/skill/craft/cooking))
+ prob2spoil = 1
+ user.visible_message(span_notice("[user] starts to cook [W] over [src]."))
+ for(var/i in 1 to 6)
+ if(do_after(user, 30, target = src))
+ var/obj/item/reagent_containers/food/snacks/S = W
+ var/obj/item/C
+ if(prob(prob2spoil))
+ user.visible_message(span_warning("[user] burns [S]."))
+ if(user.client?.prefs.showrolls)
+ to_chat(user, span_warning("Critfail... [prob2spoil]%."))
+ C = S.cooking(1000, null)
+ else
+ C = S.cooking(S.cooktime/4, src)
+ if(C)
+ user.dropItemToGround(S, TRUE)
+ qdel(S)
+ C.forceMove(get_turf(user))
+ user.put_in_hands(C)
+ break
+ else
+ break
+ return
+ if(W.firefuel)
+ if(initial(fueluse))
+ if(fueluse > initial(fueluse) - 5 SECONDS)
+ to_chat(user, span_warning("[src] is fully fueled."))
+ return
+ else
+ if(!on)
+ return
+ if (alert(usr, "Feed [W] to the fire?", "ROGUETOWN", "Yes", "No") != "Yes")
+ return
+ qdel(W)
+ user.visible_message(span_warning("[user] feeds [W] to [src]."))
+ if(initial(fueluse))
+ fueluse = fueluse + W.firefuel
+ if(fueluse > initial(fueluse)) //keep it at the max
+ fueluse = initial(fueluse)
+ return
+ else
+ if(on)
+ if(istype(W, /obj/item/natural/dirtclod))
+ if(!user.temporarilyRemoveItemFromInventory(W))
+ return
+ on = FALSE
+ set_light(0)
+ update_icon()
+ qdel(W)
+ src.visible_message(span_warning("[user] snuffs the fire."))
+ return
+ if(user.used_intent?.type != INTENT_SPLASH)
+ W.spark_act()
+ . = ..()
+
+/obj/machinery/light/rogue/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+ if(!can_damage)
+ return
+ . = ..()
diff --git a/code/game/objects/lighting/_base_roguestreet.dm b/code/game/objects/lighting/_base_roguestreet.dm
new file mode 100644
index 0000000000..d7b750149d
--- /dev/null
+++ b/code/game/objects/lighting/_base_roguestreet.dm
@@ -0,0 +1,54 @@
+/obj/machinery/light/roguestreet
+ icon = 'icons/roguetown/misc/tallstructure.dmi'
+ icon_state = "slamp1"
+ base_state = "slamp"
+ brightness = 10
+ //nightshift_allowed = FALSE
+ fueluse = 0
+ bulb_colour = "#f9e080"
+ bulb_power = 1
+ max_integrity = 0
+ pass_flags = LETPASSTHROW
+
+/obj/machinery/light/roguestreet/midlamp
+ icon = 'icons/roguetown/misc/64x64.dmi'
+ icon_state = "midlamp1"
+ base_state = "midlamp"
+ pixel_x = -16
+ density = TRUE
+
+/obj/machinery/light/roguestreet/proc/lights_out()
+ on = FALSE
+ set_light(0)
+ update_icon()
+ addtimer(CALLBACK(src, PROC_REF(lights_on)), 5 MINUTES)
+
+/obj/machinery/light/roguestreet/proc/lights_on()
+ on = TRUE
+ update()
+ update_icon()
+
+/obj/machinery/light/roguestreet/update_icon()
+ if(on)
+ icon_state = "[base_state]1"
+ else
+ icon_state = "[base_state]0"
+
+/obj/machinery/light/roguestreet/update()
+ . = ..()
+ if(on)
+ GLOB.fires_list |= src
+ else
+ GLOB.fires_list -= src
+
+/obj/machinery/light/roguestreet/Initialize()
+ lights_on()
+ GLOB.streetlamp_list += src
+ update_icon()
+ . = ..()
+
+/obj/machinery/light/roguestreet/update_icon()
+ if(on)
+ icon_state = "[base_state]1"
+ else
+ icon_state = "[base_state]0"
diff --git a/code/game/objects/lighting/rogue_fires.dm b/code/game/objects/lighting/rogue_fires.dm
new file mode 100644
index 0000000000..dd173f0346
--- /dev/null
+++ b/code/game/objects/lighting/rogue_fires.dm
@@ -0,0 +1,586 @@
+/obj/machinery/light/rogue/firebowl
+ name = "brazier"
+ icon = 'icons/roguetown/misc/lighting.dmi'
+ icon_state = "stonefire1"
+ density = TRUE
+// pixel_y = 10
+ base_state = "stonefire"
+ climbable = TRUE
+ pass_flags = LETPASSTHROW
+ cookonme = TRUE
+ dir = SOUTH
+ crossfire = TRUE
+ fueluse = 0
+
+/obj/machinery/light/rogue/firebowl/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover) && (mover.pass_flags & PASSTABLE))
+ return 1
+ if(mover.throwing)
+ return 1
+ if(locate(/obj/structure/table) in get_turf(mover))
+ return 1
+ return !density
+
+/obj/machinery/light/rogue/firebowl/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+
+ if(on)
+ var/mob/living/carbon/human/H = user
+
+ if(istype(H))
+ H.visible_message(span_info("[H] warms \his hand over the fire."))
+
+ if(do_after(H, 15, target = src))
+ var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
+ to_chat(H, span_warning("HOT!"))
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
+ H.update_damage_overlays()
+ return TRUE //fires that are on always have this interaction with lmb unless its a torch
+
+ else
+ if(icon_state == "[base_state]over")
+ user.visible_message("[user] starts to pick up [src]...", \
+ "I start to pick up [src]...")
+ if(do_after(user, 30, target = src))
+ icon_state = "[base_state]0"
+ return
+
+/obj/machinery/light/rogue/firebowl/stump
+ icon_state = "stumpfire1"
+ base_state = "stumpfire"
+
+/obj/machinery/light/rogue/firebowl/church
+ icon_state = "churchfire1"
+ base_state = "churchfire"
+
+
+/obj/machinery/light/rogue/firebowl/standing
+ name = "standing fire"
+ icon_state = "standing1"
+ base_state = "standing"
+ bulb_colour = "#ff9648"
+ cookonme = FALSE
+ crossfire = FALSE
+
+
+/obj/machinery/light/rogue/firebowl/standing/blue
+ bulb_colour = "#b9bcff"
+ icon_state = "standingb1"
+ base_state = "standingb"
+
+/obj/machinery/light/rogue/firebowl/standing/proc/knock_over() //use this later for jump impacts and shit
+ icon_state = "[base_state]over"
+
+/obj/machinery/light/rogue/firebowl/standing/fire_act(added, maxstacks)
+ if(icon_state != "[base_state]over")
+ ..()
+
+/obj/machinery/light/rogue/firebowl/standing/onkick(mob/user)
+ if(isliving(user))
+ var/mob/living/L = user
+ if(icon_state == "[base_state]over")
+ playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100)
+ user.visible_message("[user] kicks [src]!", \
+ "I kick [src]!")
+ return
+ if(prob(L.STASTR * 8))
+ playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100)
+ user.visible_message("[user] kicks over [src]!", \
+ "I kick over [src]!")
+ burn_out()
+ knock_over()
+ else
+ playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100)
+ user.visible_message("[user] kicks [src]!", \
+ "I kick [src]!")
+
+/obj/machinery/light/rogue/wallfire
+ name = "fireplace"
+ icon_state = "wallfire1"
+ base_state = "wallfire"
+ density = FALSE
+ fueluse = 0
+ crossfire = FALSE
+ cookonme = TRUE
+
+/obj/machinery/light/rogue/wallfire/big_fireplace
+ icon_state = "fireplace1"
+ base_state = "fireplace"
+ icon = 'icons/roguetown/misc/fireplace64.dmi'
+
+/obj/machinery/light/rogue/wallfire/candle
+ name = "candles"
+ icon_state = "wallcandle1"
+ base_state = "wallcandle"
+ crossfire = FALSE
+ cookonme = FALSE
+ pixel_y = 32
+ soundloop = null
+
+/obj/machinery/light/rogue/wallfire/candle/OnCrafted(dirin)
+ pixel_x = 0
+ pixel_y = 0
+ switch(dirin)
+ if(NORTH)
+ pixel_y = 32
+ if(SOUTH)
+ pixel_y = -32
+ if(EAST)
+ pixel_x = 32
+ if(WEST)
+ pixel_x = -32
+ . = ..()
+
+/obj/machinery/light/rogue/wallfire/candle/attack_hand(mob/user)
+ if(isliving(user) && on)
+ user.visible_message(span_warning("[user] snuffs [src]."))
+ burn_out()
+ return TRUE //fires that are on always have this interaction with lmb unless its a torch
+ . = ..()
+
+/obj/machinery/light/rogue/wallfire/candle/r
+ pixel_y = 0
+ pixel_x = 32
+/obj/machinery/light/rogue/wallfire/candle/l
+ pixel_y = 0
+ pixel_x = -32
+
+/obj/machinery/light/rogue/wallfire/candle/blue
+ bulb_colour = "#b9bcff"
+ icon_state = "wallcandleb1"
+ base_state = "wallcandleb"
+
+/obj/machinery/light/rogue/wallfire/candle/blue/r
+ pixel_y = 0
+ pixel_x = 32
+/obj/machinery/light/rogue/wallfire/candle/blue/l
+ pixel_y = 0
+ pixel_x = -32
+
+/obj/machinery/light/rogue/wallfire/candle/weak
+ light_power = 0.9
+ light_outer_range = 6
+/obj/machinery/light/rogue/wallfire/candle/weak/l
+ pixel_x = -32
+ pixel_y = 0
+/obj/machinery/light/rogue/wallfire/candle/weak/r
+ pixel_x = 32
+ pixel_y = 0
+
+/obj/machinery/light/rogue/wallfire/candle/lamp
+ name = "candle lamp"
+ icon_state = "candle"
+ base_state = "candle"
+ icon = 'icons/roguetown/misc/decoration.dmi'
+ layer = WALL_OBJ_LAYER+0.1
+ light_power = 0.9
+ light_outer_range = 6
+
+/obj/machinery/light/rogue/torchholder
+ name = "sconce"
+ icon_state = "torchwall1"
+ base_state = "torchwall"
+ brightness = 5
+ density = FALSE
+ var/obj/item/flashlight/flare/torch/torchy
+ fueluse = FALSE //we use the torch's fuel
+ soundloop = null
+ crossfire = FALSE
+ plane = GAME_PLANE_UPPER
+ cookonme = FALSE
+
+/obj/machinery/light/rogue/torchholder/c
+ pixel_y = 32
+
+/obj/machinery/light/rogue/torchholder/r
+ dir = WEST
+
+/obj/machinery/light/rogue/torchholder/l
+ dir = EAST
+
+/obj/machinery/light/rogue/torchholder/fire_act(added, maxstacks)
+ if(torchy)
+ if(!on)
+ if(torchy.fuel > 0)
+ torchy.spark_act()
+ playsound(src.loc, 'sound/items/firelight.ogg', 100)
+ on = TRUE
+ update()
+ update_icon()
+ if(soundloop)
+ soundloop.start()
+ addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
+ return TRUE
+
+/obj/machinery/light/rogue/torchholder/Initialize()
+ torchy = new /obj/item/flashlight/flare/torch(src)
+ torchy.spark_act()
+ . = ..()
+
+/obj/machinery/light/rogue/torchholder/OnCrafted(dirin, user)
+ dir = turn(dirin, 180)
+ if(dir == SOUTH)
+ pixel_y = 32
+ QDEL_NULL(torchy)
+ . = ..()
+
+/obj/machinery/light/rogue/torchholder/process()
+ if(on)
+ if(torchy)
+ if(torchy.fuel <= 0)
+ burn_out()
+ if(!torchy.on)
+ burn_out()
+ else
+ return PROCESS_KILL
+
+/obj/machinery/light/rogue/torchholder/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+ if(torchy)
+ if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(torchy))
+ torchy.forceMove(loc)
+ torchy = null
+ on = FALSE
+ set_light(0)
+ update_icon()
+ playsound(src.loc, 'sound/foley/torchfixturetake.ogg', 70)
+
+/obj/machinery/light/rogue/torchholder/update_icon()
+ if(torchy)
+ if(on)
+ icon_state = "[base_state]1"
+ else
+ icon_state = "[base_state]0"
+ else
+ icon_state = "torchwall"
+
+/obj/machinery/light/rogue/torchholder/burn_out()
+ if(torchy && torchy.on)
+ torchy.turn_off()
+ ..()
+
+/obj/machinery/light/rogue/torchholder/attackby(obj/item/W, mob/living/user, params)
+ if(istype(W, /obj/item/flashlight/flare/torch))
+ var/obj/item/flashlight/flare/torch/LR = W
+ if(torchy)
+ if(LR.on && !on)
+ if(torchy.fuel <= 0)
+ to_chat(user, span_warning("The mounted torch is burned out."))
+ return
+ else
+ torchy.spark_act()
+ user.visible_message(span_info("[user] lights [src]."))
+ playsound(src.loc, 'sound/items/firelight.ogg', 100)
+ on = TRUE
+ update()
+ update_icon()
+ addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
+ return
+ if(!LR.on && on)
+ if(LR.fuel > 0)
+ LR.spark_act()
+ user.visible_message(span_info("[user] lights [LR] in [src]."))
+ user.update_inv_hands()
+ else
+ if(LR.on)
+ if(!user.transferItemToLoc(LR, src))
+ return
+ torchy = LR
+ on = TRUE
+ update()
+ update_icon()
+ addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
+ else
+ if(!user.transferItemToLoc(LR, src))
+ return
+ torchy = LR
+ update_icon()
+ playsound(src.loc, 'sound/foley/torchfixtureput.ogg', 70)
+ return
+ . = ..()
+
+/obj/machinery/light/rogue/chand
+ name = "chandelier"
+ icon_state = "chand1"
+ base_state = "chand"
+ icon = 'icons/roguetown/misc/tallwide.dmi'
+ density = FALSE
+ brightness = 10
+ pixel_x = -10
+ pixel_y = -10
+ layer = 2.0
+ fueluse = 0
+ soundloop = null
+ crossfire = FALSE
+ obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
+
+/obj/machinery/light/rogue/chand/attack_hand(mob/user)
+ if(isliving(user) && on)
+ user.visible_message(span_warning("[user] snuffs [src]."))
+ burn_out()
+ return TRUE //fires that are on always have this interaction with lmb unless its a torch
+ . = ..()
+
+
+/obj/machinery/light/rogue/hearth
+ name = "hearth"
+ icon_state = "hearth1"
+ base_state = "hearth"
+ density = TRUE
+ anchored = TRUE
+ climbable = TRUE
+ climb_time = 3 SECONDS
+ layer = TABLE_LAYER
+ climb_offset = 14
+ on = FALSE
+ cookonme = TRUE
+ var/obj/item/attachment = null
+ var/obj/item/reagent_containers/food/snacks/food = null
+ var/datum/looping_sound/boilloop/boilloop
+ var/rawegg = FALSE
+
+/obj/machinery/light/rogue/hearth/Initialize()
+ boilloop = new(src, FALSE)
+ . = ..()
+
+/obj/machinery/light/rogue/hearth/attackby(obj/item/W, mob/living/user, params)
+ if(!attachment)
+ if(istype(W, /obj/item/cooking/pan) || istype(W, /obj/item/reagent_containers/glass/bucket/pot))
+ playsound(get_turf(user), 'sound/foley/dropsound/shovel_drop.ogg', 40, TRUE, -1)
+ attachment = W
+ W.forceMove(src)
+ update_icon()
+ return
+ else
+ if(istype(W, /obj/item/reagent_containers/glass/bowl))
+ to_chat(user, span_notice("Remove the pot from the hearth first."))
+ return
+ if(istype(attachment, /obj/item/cooking/pan))
+ if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks))
+ var/obj/item/reagent_containers/food/snacks/S = W
+ if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) // added
+ playsound(get_turf(user), 'modular/Neu_Food/sound/eggbreak.ogg', 100, TRUE, 0)
+ sleep(25) // to get egg crack before frying hiss
+ W.icon_state = "rawegg" // added
+ rawegg = TRUE
+ if(!food)
+ S.forceMove(src)
+ food = S
+ update_icon()
+ if(on)
+ playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 5)
+ return
+// New concept = boil at least 33 water, add item, it turns into food reagent volume 33 of the appropriate type
+ else if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
+ var/obj/item/reagent_containers/glass/bucket/pot/pot = attachment
+ if(!pot.reagents.has_reagent(/datum/reagent/water, 33))
+ to_chat(user, span_notice("Not enough water."))
+ return TRUE
+ if(pot.reagents.chem_temp < 374)
+ to_chat(user, span_warning("[pot] isn't boiling!"))
+ return
+ pot.attempt_pot_recipes(W, user)
+ . = ..()
+
+//////////////////////////////////
+
+/obj/machinery/light/rogue/hearth/fire_act(added, maxstacks)
+ . = ..()
+ if(food)
+ playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 2)
+
+/obj/machinery/light/rogue/hearth/update_icon()
+ cut_overlays()
+ icon_state = "[base_state][on]"
+ if(attachment)
+ if(istype(attachment, /obj/item/cooking/pan) || istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
+ var/obj/item/I = attachment
+ I.pixel_x = 0
+ I.pixel_y = 0
+ add_overlay(new /mutable_appearance(I))
+ if(food)
+ I = food
+ I.pixel_x = 0
+ I.pixel_y = 0
+ add_overlay(new /mutable_appearance(I))
+
+/obj/machinery/light/rogue/hearth/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+
+ if(attachment)
+ if(istype(attachment, /obj/item/cooking/pan))
+ if(food)
+ if(rawegg)
+ to_chat(user, span_notice("Throws away the raw egg."))
+ rawegg = FALSE
+ qdel(food)
+ update_icon()
+ if(!user.put_in_active_hand(food))
+ food.forceMove(user.loc)
+ food = null
+ update_icon()
+ else
+ if(!user.put_in_active_hand(attachment))
+ attachment.forceMove(user.loc)
+ attachment = null
+ update_icon()
+ if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
+ if(!user.put_in_active_hand(attachment))
+ attachment.forceMove(user.loc)
+ attachment = null
+ update_icon()
+ boilloop.stop()
+ else
+ if(on)
+ var/mob/living/carbon/human/H = user
+ if(istype(H))
+ H.visible_message(span_info("[H] warms \his hand over the embers."))
+ if(do_after(H, 50, target = src))
+ var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
+ to_chat(H, span_warning("HOT!"))
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
+ H.update_damage_overlays()
+ return TRUE
+
+
+/obj/machinery/light/rogue/hearth/process()
+ if(isopenturf(loc))
+ var/turf/open/O = loc
+ if(IS_WET_OPEN_TURF(O))
+ extinguish()
+ if(on)
+ if(initial(fueluse) > 0)
+ if(fueluse > 0)
+ fueluse = max(fueluse - 10, 0)
+ if(fueluse == 0)
+ burn_out()
+ if(attachment)
+ if(istype(attachment, /obj/item/cooking/pan))
+ if(food)
+ var/obj/item/C = food.cooking(20, src)
+ if(C)
+ if(rawegg)
+ rawegg = FALSE
+ qdel(food)
+ food = C
+ if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
+ if(attachment.reagents)
+ attachment.reagents.expose_temperature(400, 0.033)
+ if(attachment.reagents.chem_temp > 374)
+ boilloop.start()
+ else
+ boilloop.stop()
+ update_icon()
+
+
+/obj/machinery/light/rogue/hearth/onkick(mob/user)
+ if(isliving(user) && on)
+ user.visible_message(span_warning("[user] snuffs [src]."))
+ burn_out()
+
+/obj/machinery/light/rogue/hearth/Destroy()
+ QDEL_NULL(boilloop)
+ . = ..()
+
+/obj/machinery/light/rogue/campfire
+ name = "campfire"
+ icon_state = "badfire1"
+ base_state = "badfire"
+ density = FALSE
+ layer = 2.8
+ brightness = 5
+ on = FALSE
+ fueluse = 15 MINUTES
+ bulb_colour = "#da5e21"
+ cookonme = TRUE
+ max_integrity = 30
+
+/obj/machinery/light/rogue/campfire/process()
+ ..()
+ if(isopenturf(loc))
+ var/turf/open/O = loc
+ if(IS_WET_OPEN_TURF(O))
+ extinguish()
+
+/obj/machinery/light/rogue/campfire/onkick(mob/user)
+ if(isliving(user) && on)
+ var/mob/living/L = user
+ L.visible_message(span_info("[L] snuffs [src]."))
+ burn_out()
+
+/obj/machinery/light/rogue/campfire/attack_hand(mob/user)
+ . = ..()
+ if(.)
+ return
+
+ if(on)
+ var/mob/living/carbon/human/H = user
+
+ if(istype(H))
+ H.visible_message(span_info("[H] warms \his hand near the fire."))
+
+ if(do_after(H, 100, target = src))
+ var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
+ to_chat(H, span_warning("HOT!"))
+ if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
+ H.update_damage_overlays()
+ return TRUE //fires that are on always have this interaction with lmb unless its a torch
+
+/obj/machinery/light/rogue/campfire/densefire
+ icon_state = "densefire1"
+ base_state = "densefire"
+ density = TRUE
+ layer = 2.8
+ brightness = 5
+ climbable = TRUE
+ on = FALSE
+ fueluse = 30 MINUTES
+ pass_flags = LETPASSTHROW
+ bulb_colour = "#eea96a"
+ max_integrity = 60
+
+/obj/machinery/light/rogue/campfire/densefire/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover) && (mover.pass_flags & PASSTABLE))
+ return 1
+ if(mover.throwing)
+ return 1
+ if(locate(/obj/structure/table) in get_turf(mover))
+ return 1
+ if(locate(/obj/machinery/light/rogue/firebowl) in get_turf(mover))
+ return 1
+ return !density
+
+
+/obj/machinery/light/rogue/campfire/pyre
+ name = "pyre"
+ icon = 'icons/roguetown/misc/tallstructure.dmi'
+ icon_state = "pyre1"
+ base_state = "pyre"
+ brightness = 10
+ fueluse = 30 MINUTES
+ layer = BELOW_MOB_LAYER
+ buckleverb = "crucifie"
+ can_buckle = 1
+ buckle_lying = 0
+ dir = NORTH
+ buckle_requires_restraints = 1
+ buckle_prevents_pull = 1
+
+
+/obj/machinery/light/rogue/campfire/pyre/post_buckle_mob(mob/living/M)
+ ..()
+ M.set_mob_offsets("bed_buckle", _x = 0, _y = 10)
+ M.setDir(SOUTH)
+
+/obj/machinery/light/rogue/campfire/pyre/post_unbuckle_mob(mob/living/M)
+ ..()
+ M.reset_offsets("bed_buckle")
+
+/obj/machinery/light/rogue/campfire/longlived
+ fueluse = 180 MINUTES
diff --git a/code/game/objects/lighting/roguelighting.dm b/code/game/objects/lighting/roguelighting.dm
deleted file mode 100644
index b779563bff..0000000000
--- a/code/game/objects/lighting/roguelighting.dm
+++ /dev/null
@@ -1,1016 +0,0 @@
-/obj/machinery/light/roguestreet
- icon = 'icons/roguetown/misc/tallstructure.dmi'
- icon_state = "slamp1"
- base_state = "slamp"
- brightness = 10
- nightshift_allowed = FALSE
- fueluse = 0
- bulb_colour = "#f9e080"
- bulb_power = 0.85
- max_integrity = 0
- use_power = NO_POWER_USE
- var/datum/looping_sound/soundloop
- pass_flags = LETPASSTHROW
-
-/obj/machinery/light/roguestreet/midlamp
- icon = 'icons/roguetown/misc/64x64.dmi'
- icon_state = "midlamp1"
- base_state = "midlamp"
- pixel_x = -16
- density = TRUE
-
-/obj/machinery/light/roguestreet/proc/lights_out()
- if(soundloop)
- soundloop.stop()
- on = FALSE
- set_light(0)
- update_icon()
- addtimer(CALLBACK(src, PROC_REF(lights_on)), 5 MINUTES)
-
-/obj/machinery/light/roguestreet/proc/lights_on()
- on = TRUE
- update()
- update_icon()
- if(soundloop)
- soundloop.start()
-
-/obj/machinery/light/roguestreet/update_icon()
- if(on)
- icon_state = "[base_state]1"
- else
- icon_state = "[base_state]0"
-
-/obj/machinery/light/roguestreet/update()
- . = ..()
- if(on)
- GLOB.fires_list |= src
- else
- GLOB.fires_list -= src
-
-/obj/machinery/light/roguestreet/Initialize()
- soundloop = pick(/datum/looping_sound/streetlamp1,/datum/looping_sound/streetlamp2,/datum/looping_sound/streetlamp3)
- if(soundloop)
- soundloop = new soundloop(src, FALSE)
- soundloop.start()
- GLOB.streetlamp_list += src
- update_icon()
- . = ..()
-
-/obj/machinery/light/roguestreet/update_icon()
- if(on)
- icon_state = "[base_state]1"
- else
- icon_state = "[base_state]0"
-
-//fires
-/obj/machinery/light/rogue
- icon = 'icons/roguetown/misc/lighting.dmi'
- brightness = 8
- nightshift_allowed = FALSE
- fueluse = 60 MINUTES
- bulb_colour = "#f9ad80"
- bulb_power = 1
- use_power = NO_POWER_USE
- var/datum/looping_sound/soundloop = /datum/looping_sound/fireloop
- pass_flags = LETPASSTHROW
- var/cookonme = FALSE
- var/crossfire = TRUE
-
-/obj/machinery/light/rogue/Initialize()
- if(soundloop)
- soundloop = new soundloop(src, FALSE)
- soundloop.start()
- GLOB.fires_list += src
- if(fueluse)
- fueluse = fueluse - (rand(fueluse*0.1,fueluse*0.3))
- update_icon()
- seton(TRUE)
- . = ..()
-
-/obj/machinery/light/rogue/weather_trigger(W)
- if(W==/datum/weather/rain)
- START_PROCESSING(SSweather,src)
-
-/obj/machinery/light/rogue/attack_hand(mob/living/carbon/human/user)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
- add_fingerprint(user)
-
-
-/obj/machinery/light/rogue/examine(mob/user)
- . = ..()
- if(Adjacent(user))
- if(fueluse > 0)
- var/minsleft = fueluse / 600
- minsleft = round(minsleft)
- if(minsleft <= 1)
- minsleft = "less than a minute"
- else
- minsleft = "[round(minsleft)] minutes"
- . += "The fire will last for [minsleft]."
- else
- if(initial(fueluse) > 0)
- . += "The fire is burned out and hungry..."
-
-
-/obj/machinery/light/rogue/extinguish()
- if(on)
- burn_out()
- new /obj/effect/temp_visual/small_smoke(src.loc)
- ..()
-
-
-
-/obj/machinery/light/rogue/burn_out()
- if(soundloop)
- soundloop.stop()
- if(on)
- playsound(src.loc, 'sound/items/firesnuff.ogg', 100)
- ..()
- update_icon()
-
-/obj/machinery/light/rogue/update_icon()
- if(on)
- icon_state = "[base_state]1"
- else
- icon_state = "[base_state]0"
-
-/obj/machinery/light/rogue/update()
- . = ..()
- if(on)
- GLOB.fires_list |= src
- else
- GLOB.fires_list -= src
-
-/obj/machinery/light/rogue/Destroy()
- QDEL_NULL(soundloop)
- GLOB.fires_list -= src
- . = ..()
-
-/obj/machinery/light/rogue/fire_act(added, maxstacks)
- if(!on && ((fueluse > 0) || (initial(fueluse) == 0)))
- playsound(src.loc, 'sound/items/firelight.ogg', 100)
- on = TRUE
- update()
- update_icon()
- if(soundloop)
- soundloop.start()
- addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
- return TRUE
-
-/obj/proc/trigger_weather()
- if(!QDELETED(src))
- if(isturf(loc))
- var/turf/T = loc
- T.trigger_weather(src)
-
-/obj/machinery/light/rogue/Crossed(atom/movable/AM, oldLoc)
- ..()
- if(crossfire)
- if(on)
- AM.fire_act(1,5)
-
-/obj/machinery/light/rogue/spark_act()
- fire_act()
-
-/obj/machinery/light/rogue/attackby(obj/item/W, mob/living/user, params)
- if(cookonme)
- if(istype(W, /obj/item/reagent_containers/food/snacks))
- if(istype(W, /obj/item/reagent_containers/food/snacks/egg))
- to_chat(user, "I wouldn't be able to cook this over the fire...")
- return FALSE
- var/obj/item/A = user.get_inactive_held_item()
- if(A)
- var/foundstab = FALSE
- for(var/X in A.possible_item_intents)
- var/datum/intent/D = new X
- if(D.blade_class == BCLASS_STAB)
- foundstab = TRUE
- break
- if(foundstab)
- var/prob2spoil = 33
- if(user.mind.get_skill_level(/datum/skill/craft/cooking))
- prob2spoil = 1
- user.visible_message("[user] starts to cook [W] over [src].")
- for(var/i in 1 to 6)
- if(do_after(user, 30, target = src))
- var/obj/item/reagent_containers/food/snacks/S = W
- var/obj/item/C
- if(prob(prob2spoil))
- user.visible_message("[user] burns [S].")
- if(user.client?.prefs.showrolls)
- to_chat(user, "Critfail... [prob2spoil]%.")
- C = S.cooking(1000, null)
- else
- C = S.cooking(S.cooktime/4, src)
- if(C)
- user.dropItemToGround(S, TRUE)
- qdel(S)
- C.forceMove(get_turf(user))
- user.put_in_hands(C)
- break
- else
- break
- return
- if(W.firefuel)
- if(initial(fueluse))
- if(fueluse > initial(fueluse) - 5 SECONDS)
- to_chat(user, "Full.")
- return
- else
- if(!on)
- return
- if (alert(usr, "Feed [W] to the fire?", "ROGUETOWN", "Yes", "No") != "Yes")
- return
- qdel(W)
- user.visible_message("[user] feeds [W] to [src].")
- if(initial(fueluse))
- fueluse = fueluse + W.firefuel
- if(fueluse > initial(fueluse)) //keep it at the max
- fueluse = initial(fueluse)
- return
- else
- if(on)
- if(istype(W, /obj/item/natural/dirtclod))
- if(!user.temporarilyRemoveItemFromInventory(W))
- return
- on = FALSE
- set_light(0)
- update_icon()
- qdel(W)
- src.visible_message("[user] snuffs the fire.")
- return
- if(user.used_intent?.type != INTENT_SPLASH)
- W.spark_act()
- ..()
-
-/obj/machinery/light/rogue/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
- return
-
-/obj/machinery/light/rogue/firebowl
- name = "brazier"
- icon = 'icons/roguetown/misc/lighting.dmi'
- icon_state = "stonefire1"
- density = TRUE
-// pixel_y = 10
- base_state = "stonefire"
- climbable = TRUE
- pass_flags = LETPASSTHROW
- cookonme = TRUE
- dir = SOUTH
- crossfire = TRUE
- fueluse = 0
- light_outer_range = 9
-
-/obj/machinery/light/rogue/firebowl/CanPass(atom/movable/mover, turf/target)
- if(istype(mover) && (mover.pass_flags & PASSTABLE))
- return 1
- if(mover.throwing)
- return 1
- if(locate(/obj/structure/table) in get_turf(mover))
- return 1
- return !density
-
-/obj/machinery/light/rogue/firebowl/attack_hand(mob/user)
- . = ..()
- if(.)
- return
-
- if(on)
- var/mob/living/carbon/human/H = user
-
- if(istype(H))
- H.visible_message("[H] warms \his hand over the fire.")
-
- if(do_after(H, 15, target = src))
- var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- to_chat(H, "HOT!")
- if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
- H.update_damage_overlays()
- return TRUE //fires that are on always have this interaction with lmb unless its a torch
-
- else
- if(icon_state == "[base_state]over")
- user.visible_message("[user] starts to pick up [src]...", \
- "I start to pick up [src]...")
- if(do_after(user, 30, target = src))
- icon_state = "[base_state]0"
- return
-
-/obj/machinery/light/rogue/firebowl/stump
- icon_state = "stumpfire1"
- base_state = "stumpfire"
-
-/obj/machinery/light/rogue/firebowl/church
- icon_state = "churchfire1"
- base_state = "churchfire"
-
-
-/obj/machinery/light/rogue/firebowl/standing
- name = "standing fire"
- icon_state = "standing1"
- base_state = "standing"
- bulb_colour = "#ff9648"
- cookonme = FALSE
- crossfire = FALSE
-
-
-/obj/machinery/light/rogue/firebowl/standing/blue
- bulb_colour = "#b9bcff"
- icon_state = "standingb1"
- base_state = "standingb"
-
-/obj/machinery/light/rogue/firebowl/standing/proc/knock_over() //use this later for jump impacts and shit
- icon_state = "[base_state]over"
-
-/obj/machinery/light/rogue/firebowl/standing/fire_act(added, maxstacks)
- if(icon_state != "[base_state]over")
- ..()
-
-/obj/machinery/light/rogue/firebowl/standing/onkick(mob/user)
- if(isliving(user))
- var/mob/living/L = user
- if(icon_state == "[base_state]over")
- playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100)
- user.visible_message("[user] kicks [src]!", \
- "I kick [src]!")
- return
- if(prob(L.STASTR * 8))
- playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100)
- user.visible_message("[user] kicks over [src]!", \
- "I kick over [src]!")
- burn_out()
- knock_over()
- else
- playsound(src, 'sound/combat/hits/onwood/woodimpact (1).ogg', 100)
- user.visible_message("[user] kicks [src]!", \
- "I kick [src]!")
-
-/obj/machinery/light/rogue/wallfire
- name = "fireplace"
- icon_state = "wallfire1"
- base_state = "wallfire"
- density = FALSE
- fueluse = 0
- crossfire = FALSE
- cookonme = TRUE
-
-/obj/machinery/light/rogue/wallfire/candle
- name = "candles"
- icon_state = "wallcandle1"
- base_state = "wallcandle"
- crossfire = FALSE
- cookonme = FALSE
- pixel_y = 32
- soundloop = null
-
-/obj/machinery/light/rogue/wallfire/candle/attack_hand(mob/user)
- if(isliving(user) && on)
- user.visible_message("[user] snuffs [src].")
- burn_out()
- return TRUE //fires that are on always have this interaction with lmb unless its a torch
- . = ..()
-
-/obj/machinery/light/rogue/wallfire/candle/r
- pixel_y = 0
- pixel_x = 32
-/obj/machinery/light/rogue/wallfire/candle/l
- pixel_y = 0
- pixel_x = -32
-
-/obj/machinery/light/rogue/wallfire/candle/blue
- bulb_colour = "#b9bcff"
- icon_state = "wallcandleb1"
- base_state = "wallcandleb"
-
-/obj/machinery/light/rogue/wallfire/candle/blue/r
- pixel_y = 0
- pixel_x = 32
-/obj/machinery/light/rogue/wallfire/candle/blue/l
- pixel_y = 0
- pixel_x = -32
-
-/obj/machinery/light/rogue/wallfire/candle/weak
- light_power = 0.9
- light_outer_range = 6
-/obj/machinery/light/rogue/wallfire/candle/weak/l
- pixel_x = -32
- pixel_y = 0
-/obj/machinery/light/rogue/wallfire/candle/weak/r
- pixel_x = 32
- pixel_y = 0
-
-/obj/machinery/light/rogue/torchholder
- name = "sconce"
- icon_state = "torchwall1"
- base_state = "torchwall"
- brightness = 5
- density = FALSE
- var/obj/item/flashlight/flare/torch/torchy
- fueluse = FALSE //we use the torch's fuel
- soundloop = null
- crossfire = FALSE
- plane = GAME_PLANE_UPPER
- cookonme = FALSE
- var/lacks_torch
-
-/obj/machinery/light/rogue/torchholder/c
- pixel_y = 32
-
-/obj/machinery/light/rogue/torchholder/r
- dir = WEST
-
-/obj/machinery/light/rogue/torchholder/l
- dir = EAST
-
-/obj/machinery/light/rogue/torchholder/fire_act(added, maxstacks)
- if(torchy)
- if(!on)
- if(torchy.fuel > 0)
- torchy.spark_act()
- playsound(src.loc, 'sound/items/firelight.ogg', 100)
- on = TRUE
- update()
- update_icon()
- if(soundloop)
- soundloop.start()
- addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
- return TRUE
-
-/obj/machinery/light/rogue/torchholder/Initialize()
- if(!lacks_torch)
- torchy = new /obj/item/flashlight/flare/torch(src)
- torchy.spark_act()
- . = ..()
-
-/obj/machinery/light/rogue/torchholder/process()
- if(on)
- if(torchy)
- if(torchy.fuel <= 0)
- burn_out()
- if(!torchy.on)
- burn_out()
- else
- return PROCESS_KILL
-
-/obj/machinery/light/rogue/torchholder/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- if(torchy)
- if(!istype(user) || !Adjacent(user) || !user.put_in_active_hand(torchy))
- torchy.forceMove(loc)
- torchy = null
- on = FALSE
- set_light(0)
- update_icon()
- playsound(src.loc, 'sound/foley/torchfixturetake.ogg', 70)
-
-/obj/machinery/light/rogue/torchholder/update_icon()
- if(torchy)
- if(on)
- icon_state = "[base_state]1"
- else
- icon_state = "[base_state]0"
- else
- icon_state = "torchwall"
-
-/obj/machinery/light/rogue/torchholder/burn_out()
- if(torchy.on)
- torchy.turn_off()
- ..()
-
-/obj/machinery/light/rogue/torchholder/attackby(obj/item/W, mob/living/user, params)
- if(istype(W, /obj/item/flashlight/flare/torch))
- var/obj/item/flashlight/flare/torch/LR = W
- if(torchy)
- if(LR.on && !on)
- if(torchy.fuel <= 0)
- to_chat(user, "The mounted torch is burned out.")
- return
- else
- torchy.spark_act()
- user.visible_message("[user] lights [src].")
- playsound(src.loc, 'sound/items/firelight.ogg', 100)
- on = TRUE
- update()
- update_icon()
- addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
- return
- if(!LR.on && on)
- if(LR.fuel > 0)
- LR.spark_act()
- user.visible_message("[user] lights [LR] in [src].")
- user.update_inv_hands()
- else
- if(LR.on)
- LR.forceMove(src)
- torchy = LR
- on = TRUE
- update()
- update_icon()
- addtimer(CALLBACK(src, PROC_REF(trigger_weather)), rand(5,20))
- else
- LR.forceMove(src)
- torchy = LR
- update_icon()
- playsound(src.loc, 'sound/foley/torchfixtureput.ogg', 70)
- return
- . = ..()
-
-/obj/machinery/light/rogue/torchholder/cold
- lacks_torch = TRUE
- pixel_y = 32
-
-/obj/machinery/light/rogue/chand
- name = "chandelier"
- icon_state = "chand1"
- base_state = "chand"
- icon = 'icons/roguetown/misc/tallwide.dmi'
- density = FALSE
- brightness = 10
- pixel_x = -10
- pixel_y = -10
- layer = 2.0
- fueluse = 0
- soundloop = null
- crossfire = FALSE
- obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
-
-/obj/machinery/light/rogue/chand/attack_hand(mob/user)
- if(isliving(user) && on)
- user.visible_message("[user] snuffs [src].")
- burn_out()
- return TRUE //fires that are on always have this interaction with lmb unless its a torch
- . = ..()
-
-
-/obj/machinery/light/rogue/hearth
- name = "hearth"
- icon_state = "hearth1"
- base_state = "hearth"
- density = TRUE
- anchored = TRUE
- climbable = TRUE
- climb_time = 3 SECONDS
- layer = TABLE_LAYER
- climb_offset = 14
- on = FALSE
- cookonme = TRUE
- var/obj/item/attachment = null
- var/obj/item/reagent_containers/food/snacks/food = null
- var/datum/looping_sound/boilloop/boilloop
- var/rawegg = FALSE
-
-/obj/machinery/light/rogue/hearth/Initialize()
- boilloop = new(src, FALSE)
- . = ..()
-
-/obj/machinery/light/rogue/hearth/attackby(obj/item/W, mob/living/user, params)
- if(!attachment)
- if(istype(W, /obj/item/cooking/pan) || istype(W, /obj/item/reagent_containers/glass/bucket/pot))
- playsound(get_turf(user), 'sound/foley/dropsound/shovel_drop.ogg', 40, TRUE, -1)
- attachment = W
- W.forceMove(src)
- update_icon()
- return
- else
- if(istype(W, /obj/item/reagent_containers/glass/bowl))
- to_chat(user, "Remove the pot from the hearth first.")
- return
- if(istype(attachment, /obj/item/cooking/pan))
- if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks))
- var/obj/item/reagent_containers/food/snacks/S = W
- if(istype(W, /obj/item/reagent_containers/food/snacks/egg)) // added
- playsound(get_turf(user), 'modular/Neu_Food/sound/eggbreak.ogg', 100, TRUE, 0)
- sleep(25) // to get egg crack before frying hiss
- W.icon_state = "rawegg" // added
- rawegg = TRUE
- if(!food)
- S.forceMove(src)
- food = S
- update_icon()
- if(on)
- playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 5)
- return
-// New concept = boil at least 33 water, add item, it turns into food reagent volume 33 of the appropriate type
- else if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
- var/obj/item/reagent_containers/glass/bucket/pot = attachment
- if(!pot.reagents.has_reagent(/datum/reagent/water, 33))
- to_chat(user, "Not enough water.")
- return TRUE
- if(pot.reagents.chem_temp < 374)
- to_chat(user, "[pot] isn't boiling!")
- return
- if(istype(W, /obj/item/reagent_containers/food/snacks/produce/oat))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- qdel(W)
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- sleep(300)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/oatmeal, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- return
-
- if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rogue/veg))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/potato_sliced))
- qdel(W)
- sleep(800)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/potato, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/onion_sliced))
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/onion, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/cabbage_sliced))
- qdel(W)
- sleep(700)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/cabbage, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/veg/turnip_sliced))
- qdel(W)
- sleep(700)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/veggie/turnip, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- return
-
- if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rogue/meat))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/mince/fish))
- qdel(W)
- sleep(800)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/fish, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/poultry/cutlet) || istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/mince/poultry))
- qdel(W)
- sleep(900)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/chicken, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/meat/spider))
- qdel(W)
- sleep(1000)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/gross, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- else
- qdel(W)
- sleep(900)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/meat, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(istype(W, /obj/item/reagent_containers/food/snacks/egg))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places the [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(800)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/egg, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/truffles))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places the [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(800)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/truffle, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(istype(W, /obj/item/reagent_containers/food/snacks/rogue/cheese) || istype(W, /obj/item/reagent_containers/food/snacks/rogue/cheddarwedge))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places the [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(800)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/cheese, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- // drugs and such
- if(istype(W, /obj/item/reagent_containers/powder/spice))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places the [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(500)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/druqks = 15)
- pot.reagents.add_reagent(/datum/reagent/water/spicy = 17)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- // Bad and rotten and toxic stuff below. Less lethal due to boiling, but really disgusting. Graggars inhumen followers love this stuff, get some healing from it too.
- if(istype(W, /obj/item/reagent_containers/food/snacks/produce/jacksberry/poison) || istype(W, /obj/item/natural/poo)|| istype(W, /obj/item/reagent_containers/food/snacks/rogue/toxicshrooms) || istype(W, /obj/item/natural/worms))
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(W.type in subtypesof(/obj/item/reagent_containers/food/snacks/rotten)) // Graggar likes rotten food I guess
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(W.type in subtypesof(/obj/item/organ)) // ....and leeches and such....andd organs more MORE MORE if()!!! GIVE ME MOOORE
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(W.type in subtypesof(/obj/item/natural/worms)) // ....and leeches and such....andd organs more MORE MORE if()!!! GIVE ME MOOORE
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- if(istype(W, /obj/item/reagent_containers/food/snacks/smallrat/dead) || istype(W, /obj/item/reagent_containers/food/snacks/badrecipe)) // every beggar loves ratsoup
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] places the [W] into the pot.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 20, TRUE)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/consumable/soup/stew/gross, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
-
- else if(istype(W, /obj/item/reagent_containers/food/snacks/smallrat)) // a step to far for most beggars, paying tribute to Graggar
- if(do_after(user,2 SECONDS, target = src))
- user.visible_message("[user] throws [W] into the boiling water.")
- playsound(src.loc, 'sound/items/Fish_out.ogg', 60, TRUE)
- sleep(3)
- playsound(src, 'sound/vo/mobs/rat/rat_death.ogg', 100, FALSE, -1)
- pot.reagents.remove_reagent(/datum/reagent/water, 32)
- qdel(W)
- sleep(600)
- playsound(src, "bubbles", 30, TRUE)
- pot.reagents.add_reagent(/datum/reagent/yuck/cursed_soup, 32)
- pot.reagents.remove_reagent(/datum/reagent/water, 1)
- . = ..()
-
-//////////////////////////////////
-
-/obj/machinery/light/rogue/hearth/fire_act(added, maxstacks)
- . = ..()
- if(food)
- playsound(src.loc, 'sound/misc/frying.ogg', 80, FALSE, extrarange = 2)
-
-/obj/machinery/light/rogue/hearth/update_icon()
- cut_overlays()
- icon_state = "[base_state][on]"
- if(attachment)
- if(istype(attachment, /obj/item/cooking/pan) || istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
- var/obj/item/I = attachment
- I.pixel_x = 0
- I.pixel_y = 0
- add_overlay(new /mutable_appearance(I))
- if(food)
- I = food
- I.pixel_x = 0
- I.pixel_y = 0
- add_overlay(new /mutable_appearance(I))
-
-/obj/machinery/light/rogue/hearth/attack_hand(mob/user)
- . = ..()
- if(.)
- return
-
- if(attachment)
- if(istype(attachment, /obj/item/cooking/pan))
- if(food)
- if(rawegg)
- to_chat(user, "Throws away the raw egg.")
- rawegg = FALSE
- qdel(food)
- update_icon()
- if(!user.put_in_active_hand(food))
- food.forceMove(user.loc)
- food = null
- update_icon()
- else
- if(!user.put_in_active_hand(attachment))
- attachment.forceMove(user.loc)
- attachment = null
- update_icon()
- if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
- if(!user.put_in_active_hand(attachment))
- attachment.forceMove(user.loc)
- attachment = null
- update_icon()
- boilloop.stop()
- else
- if(on)
- var/mob/living/carbon/human/H = user
- if(istype(H))
- H.visible_message("[H] warms \his hand over the embers.")
- if(do_after(H, 50, target = src))
- var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- to_chat(H, "HOT!")
- if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
- H.update_damage_overlays()
- return TRUE
-
-
-/obj/machinery/light/rogue/hearth/process()
- if(isopenturf(loc))
- var/turf/open/O = loc
- if(IS_WET_OPEN_TURF(O))
- extinguish()
- if(on)
- if(initial(fueluse) > 0)
- if(fueluse > 0)
- fueluse = max(fueluse - 10, 0)
- if(fueluse == 0)
- burn_out()
- if(attachment)
- if(istype(attachment, /obj/item/cooking/pan))
- if(food)
- var/obj/item/C = food.cooking(20, src)
- if(C)
- if(rawegg)
- rawegg = FALSE
- qdel(food)
- food = C
- if(istype(attachment, /obj/item/reagent_containers/glass/bucket/pot))
- if(attachment.reagents)
- attachment.reagents.expose_temperature(400, 0.033)
- if(attachment.reagents.chem_temp > 374)
- boilloop.start()
- else
- boilloop.stop()
- update_icon()
-
-
-/obj/machinery/light/rogue/hearth/onkick(mob/user)
- if(isliving(user) && on)
- user.visible_message("[user] snuffs [src].")
- burn_out()
-
-/obj/machinery/light/rogue/hearth/Destroy()
- QDEL_NULL(boilloop)
- . = ..()
-
-/obj/machinery/light/rogue/campfire
- name = "campfire"
- icon_state = "badfire1"
- base_state = "badfire"
- density = FALSE
- layer = 2.8
- brightness = 5
- on = FALSE
- fueluse = 15 MINUTES
- bulb_colour = "#da5e21"
- cookonme = TRUE
- light_outer_range = 7
-
-/obj/machinery/light/rogue/campfire/process()
- ..()
- if(isopenturf(loc))
- var/turf/open/O = loc
- if(IS_WET_OPEN_TURF(O))
- extinguish()
-
-/obj/machinery/light/rogue/campfire/onkick(mob/user)
- if(isliving(user) && on)
- var/mob/living/L = user
- L.visible_message("[L] snuffs [src].")
- burn_out()
-
-/obj/machinery/light/rogue/campfire/attack_hand(mob/user)
- . = ..()
- if(.)
- return
-
- if(on)
- var/mob/living/carbon/human/H = user
-
- if(istype(H))
- H.visible_message("[H] warms \his hand near the fire.")
-
- if(do_after(H, 100, target = src))
- var/obj/item/bodypart/affecting = H.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- to_chat(H, "HOT!")
- if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage
- H.update_damage_overlays()
- return TRUE //fires that are on always have this interaction with lmb unless its a torch
-
-/obj/machinery/light/rogue/campfire/densefire
- icon_state = "densefire1"
- base_state = "densefire"
- density = TRUE
- layer = 2.8
- brightness = 5
- climbable = TRUE
- on = FALSE
- fueluse = 30 MINUTES
- pass_flags = LETPASSTHROW
- bulb_colour = "#eea96a"
-
-/obj/machinery/light/rogue/campfire/densefire/CanPass(atom/movable/mover, turf/target)
- if(istype(mover) && (mover.pass_flags & PASSTABLE))
- return 1
- if(mover.throwing)
- return 1
- if(locate(/obj/structure/table) in get_turf(mover))
- return 1
- if(locate(/obj/machinery/light/rogue/firebowl) in get_turf(mover))
- return 1
- return !density
-
-
-/obj/machinery/light/rogue/campfire/pyre
- name = "Pyre"
- icon = 'icons/roguetown/misc/tallstructure.dmi'
- icon_state = "pyre1"
- base_state = "pyre"
- brightness = 10
- fueluse = 30 MINUTES
- layer = BELOW_MOB_LAYER
- buckleverb = "crucifie"
- can_buckle = 1
- buckle_lying = 0
- dir = NORTH
- buckle_requires_restraints = 1
- buckle_prevents_pull = 1
-
-
-/obj/machinery/light/rogue/campfire/pyre/post_buckle_mob(mob/living/M)
- ..()
- M.set_mob_offsets("bed_buckle", _x = 0, _y = 10)
- M.setDir(SOUTH)
-
-/obj/machinery/light/rogue/campfire/pyre/post_unbuckle_mob(mob/living/M)
- ..()
- M.reset_offsets("bed_buckle")
-
-/obj/machinery/light/rogue/campfire/longlived
- fueluse = 180 MINUTES
-
-// ======================================================================
-/obj/machinery/light/rogue/wallfire/candle/lamp // cant get them to start unlit but they work as is
- name = "candle lamp"
- icon = 'icons/roguetown/misc/decoration.dmi'
- icon_state = "candle"
- base_state = "candle"
- layer = WALL_OBJ_LAYER+0.1
- light_power = 0.9
- light_outer_range = 6
-
-/obj/machinery/light/rogue/wallfire/big_fireplace
- icon_state = "fireplace1"
- base_state = "fireplace"
- icon = 'icons/roguetown/misc/fireplace64.dmi'
-
-/obj/machinery/light/rogue/hearth/big_fireplace
- name = "fireplace"
- icon_state = "fireplace1"
- base_state = "fireplace"
- icon = 'icons/roguetown/misc/fireplace64.dmi'
- fueluse = -1
- pixel_x = -16
- climb_offset = 4
diff --git a/code/modules/roguetown/roguecrafting/weaving.dm b/code/modules/roguetown/roguecrafting/weaving.dm
index d75c82b0dd..29092d3645 100644
--- a/code/modules/roguetown/roguecrafting/weaving.dm
+++ b/code/modules/roguetown/roguecrafting/weaving.dm
@@ -173,6 +173,20 @@
craftdiff = 4
sellprice = 25
+/datum/crafting_recipe/roguetown/weaving/nocrobe
+ name = "noc robes"
+ result = list(/obj/item/clothing/suit/roguetown/shirt/robe/noc)
+ reqs = list(/obj/item/natural/cloth = 4)
+ craftdiff = 4
+ sellprice = 25
+
+/datum/crafting_recipe/roguetown/weaving/nochood
+ name = "moon hood"
+ result = list(/obj/item/clothing/head/roguetown/roguehood/nochood)
+ reqs = list(/obj/item/natural/cloth = 2)
+ craftdiff = 4
+ sellprice = 25
+
/datum/crafting_recipe/roguetown/weaving/dendorrobe
name = "dendor robes"
result = list(/obj/item/clothing/suit/roguetown/shirt/robe/dendor)
diff --git a/code/modules/roguetown/roguejobs/cook/tools/pot.dm b/code/modules/roguetown/roguejobs/cook/tools/pot.dm
index db48544709..89a67b4750 100644
--- a/code/modules/roguetown/roguejobs/cook/tools/pot.dm
+++ b/code/modules/roguetown/roguejobs/cook/tools/pot.dm
@@ -10,18 +10,85 @@
slot_flags = null
w_class = WEIGHT_CLASS_BULKY
drop_sound = 'sound/foley/dropsound/shovel_drop.ogg'
+ var/processing_amount = 0 ///we use this to "reserve" reagents
+ var/list/in_progress_recipes = list() //these are unique creations only ever used
+ var/static/list/checker_recipes = list()
+
+/obj/item/reagent_containers/glass/bucket/pot/Destroy()
+ . = ..()
+ in_progress_recipes = null
+
+/obj/item/reagent_containers/glass/bucket/pot/proc/attempt_pot_recipes(obj/item/attacked_item, mob/living/user)
+ var/water_amount = reagents.get_reagent_amount(/datum/reagent/water)
+ water_amount -= processing_amount
+
+ if(!length(checker_recipes))
+ for(var/datum/pot_recipe/recipe as anything in typesof(/datum/pot_recipe))
+ if(is_abstract(recipe))
+ continue
+ checker_recipes |= new recipe
+
+ for(var/datum/pot_recipe/recipe as anything in in_progress_recipes)
+ for(var/required_type as anything in recipe.required_items)
+ if(!istype(attacked_item, required_type))
+ continue
+ qdel(attacked_item)
+ user.visible_message("[user] places [attacked_item] into the pot.")
+ playsound(get_turf(src), 'sound/items/Fish_out.ogg', 20, TRUE)
+ recipe.required_items[required_type]--
+ if(recipe.required_items[required_type] <= 0)
+ recipe.required_items -= required_type
+ break
+ if(!length(recipe.required_items) && !recipe.cooking)
+ recipe.start_cooking(src, user)
+ return TRUE
+
+ var/datum/pot_recipe/fallback
+ var/datum/pot_recipe/recipe_type
+ ///this is wonky but we always check for the first item, so we don't need to radial soups because that would suck
+ for(var/datum/pot_recipe/recipe as anything in checker_recipes)
+ var/obj/item/first_type = recipe.required_items[1]
+ if(water_amount < recipe.water_volume)
+ continue //lack of water
+ if(!istype(attacked_item, first_type))
+ continue
+
+ if(recipe.fallback)
+ fallback = recipe.type
+ continue
+ recipe_type = recipe.type
+
+ if(!recipe_type)
+ recipe_type = fallback
+
+ if(!recipe_type)
+ return FALSE
+
+ var/datum/pot_recipe/created_recipe = new recipe_type
+ var/obj/item/first_type = created_recipe.required_items[1]
+ in_progress_recipes |= created_recipe
+ qdel(attacked_item)
+ user.visible_message("[user] places [attacked_item] into the pot.")
+ playsound(get_turf(src), 'sound/items/Fish_out.ogg', 20, TRUE)
+ created_recipe.required_items[first_type]--
+ if(created_recipe.required_items[first_type] <= 0)
+ created_recipe.required_items -= first_type
+ if(!length(created_recipe.required_items) && !created_recipe.cooking)
+ created_recipe.start_cooking(src, user)
+ return TRUE
+ return TRUE
/obj/item/reagent_containers/glass/bucket/pot/update_icon()
cut_overlays()
- if(reagents.total_volume > 0)
- if(reagents.total_volume <= 50)
+ if(reagents.total_volume > 0)
+ if(reagents.total_volume <= 50)
var/mutable_appearance/filling = mutable_appearance('modular/Neu_Food/icons/cooking.dmi', "pote_half")
filling.color = mix_color_from_reagents(reagents.reagent_list)
filling.alpha = mix_alpha_from_reagents(reagents.reagent_list)
add_overlay(filling)
- if(reagents.total_volume > 50)
+ if(reagents.total_volume > 50)
var/mutable_appearance/filling = mutable_appearance('modular/Neu_Food/icons/cooking.dmi', "pote_full")
filling.color = mix_color_from_reagents(reagents.reagent_list)
filling.alpha = mix_alpha_from_reagents(reagents.reagent_list)
@@ -37,7 +104,7 @@
return TRUE
/obj/item/reagent_containers/glass/bucket/pot/throw_impact(atom/hit_atom, datum/thrownthing/thrownthing)
- if(reagents.total_volume > 5)
+ if(reagents.total_volume > 5)
new /obj/effect/decal/cleanable/food/mess/soup(get_turf(src))
..()
@@ -48,3 +115,183 @@
if("gen")
return list("shrink" = 0.5,"sx" = -5,"sy" = -8,"nx" = 7,"ny" = -9,"wx" = -1,"wy" = -8,"ex" = -1,"ey" = -8,"northabove" = 0,"southabove" = 1,"eastabove" = 1,"westabove" = 0,"nturn" = 0,"sturn" = 0,"wturn" = 0,"eturn" = 0,"nflip" = 0,"sflip" = 0,"wflip" = 0,"eflip" = 0)
+///this is where pot recipes go
+
+/datum/pot_recipe
+ abstract_type = /datum/pot_recipe
+ var/datum/reagent/produced_reagent
+ var/water_volume = 33
+ ///cannot be greated then 1 as we don't extra reserve.
+ var/water_conversion = 1
+
+ var/list/required_items = list()
+
+ var/obj/item/reagent_containers/glass/bucket/pot/cooking_pot
+ var/cooking_time = 30 SECONDS
+ ///we spawn a burst of this as it finishes cooking
+ var/datum/pollutant/finished_smell
+ ///are we cooking?
+ var/cooking = FALSE
+ ///are we a fallback recipe (only picked if no recipe at all left)
+ var/fallback = FALSE
+ ///the amount we pollute
+ var/pollute_amount = 600
+
+/datum/pot_recipe/proc/start_cooking(obj/item/reagent_containers/glass/bucket/pot, mob/living/user)
+ cooking_pot = pot
+ RegisterSignal(cooking_pot, COMSIG_PARENT_QDELETING, PROC_REF(end_recipe))
+
+ var/real_cooking_time = cooking_time
+ if(user.mind)
+ real_cooking_time /= 1 + (user.mind.get_skill_level(/datum/skill/craft/cooking) * 0.5)
+ real_cooking_time = round(real_cooking_time)
+
+ cooking = TRUE
+ cooking_pot.processing_amount += water_volume
+ addtimer(CALLBACK(src, PROC_REF(finish_cooking)), cooking_time)
+
+
+/datum/pot_recipe/proc/end_recipe()
+ cooking_pot.in_progress_recipes -= src
+ cooking_pot = null
+ cooking = FALSE
+ qdel(src)
+
+/datum/pot_recipe/proc/finish_cooking()
+ if(!cooking_pot)
+ return
+
+ var/turf/pot_turf = get_turf(cooking_pot)
+ if(finished_smell)
+ pot_turf.pollute_turf(finished_smell, pollute_amount)
+ playsound(pot_turf, "bubbles", 30, TRUE)
+
+ cooking_pot.processing_amount -= water_volume
+ cooking_pot.reagents.remove_reagent(/datum/reagent/water, water_volume)
+ cooking_pot.reagents.add_reagent(produced_reagent, CEILING(water_volume * water_conversion, 1))
+
+ post_recipe() //mainly useful for drugs where we take the remainder of the water and turn it spicy
+ end_recipe()
+
+/datum/pot_recipe/proc/post_recipe()
+ return
+
+/datum/pot_recipe/oatmeal
+ produced_reagent = /datum/reagent/consumable/soup/oatmeal
+ required_items = list(/obj/item/reagent_containers/food/snacks/produce/oat = 1)
+ finished_smell = /datum/pollutant/food/oatmeal
+
+/datum/pot_recipe/potato_stew
+ cooking_time = 80 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/veggie/potato
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/potato_sliced = 1)
+ finished_smell = /datum/pollutant/food/potato_stew
+
+/datum/pot_recipe/onion_stew
+ cooking_time = 60 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/veggie/onion
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/onion_sliced = 1)
+ finished_smell = /datum/pollutant/food/onion_stew
+
+/datum/pot_recipe/cabbage_stew
+ cooking_time = 70 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/veggie/cabbage
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/cabbage_sliced = 1)
+ finished_smell = /datum/pollutant/food/cabbage_stew
+
+/datum/pot_recipe/turnip_stew
+ cooking_time = 70 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/veggie/turnip
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/veg/turnip_sliced = 1)
+ finished_smell = /datum/pollutant/food/turnip_stew
+
+/datum/pot_recipe/egg_soup
+ cooking_time = 80 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/egg
+ required_items = list(/obj/item/reagent_containers/food/snacks/egg = 1)
+ finished_smell = /datum/pollutant/food/egg_soup
+
+/datum/pot_recipe/cheese_soup
+ cooking_time = 80 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/cheese
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/cheese = 1)
+ finished_smell = /datum/pollutant/food/cheese_soup
+
+/datum/pot_recipe/cheese_soup/wedge
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/cheddarwedge = 1)
+
+/datum/pot_recipe/chicken_stew
+ cooking_time = 90 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/stew/chicken
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/mince/poultry = 1)
+ finished_smell = /datum/pollutant/food/chicken_stew
+
+/datum/pot_recipe/chicken_stew/cutlet
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/poultry/cutlet = 1)
+
+/datum/pot_recipe/generic_meat_stew
+ cooking_time = 90 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/stew/meat
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat = 1)
+ finished_smell = /datum/pollutant/food/meat_stew
+ fallback = TRUE
+
+/datum/pot_recipe/fish_stew
+ cooking_time = 80 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/stew/fish
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/mince/fish = 1)
+ finished_smell = /datum/pollutant/food/fish_stew
+
+/datum/pot_recipe/truffle_stew
+ cooking_time = 80 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/stew/truffle
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/truffles = 1)
+ finished_smell = /datum/pollutant/food/truffle_stew
+
+/datum/pot_recipe/gross_stew
+ cooking_time = 60 SECONDS
+ produced_reagent = /datum/reagent/consumable/soup/stew/gross
+ required_items = list(/obj/item/reagent_containers/food/snacks/smallrat/dead = 1)
+
+/datum/pot_recipe/gross_stew/bad_recipe
+ required_items = list(/obj/item/reagent_containers/food/snacks/badrecipe = 1)
+
+/datum/pot_recipe/drugs
+ cooking_time = 50 SECONDS
+ water_conversion = 0.45
+ produced_reagent = /datum/reagent/druqks
+ required_items = list(/obj/item/reagent_containers/powder/spice = 1)
+ finished_smell = /datum/pollutant/food/druqks
+ pollute_amount = 100
+
+/datum/pot_recipe/drugs/post_recipe()
+ var/remaining_water = water_volume - CEILING(water_volume * water_conversion, 1)
+ cooking_pot.reagents.add_reagent(/datum/reagent/water/spicy, remaining_water)
+
+/datum/pot_recipe/yuck_soup
+ cooking_time = 60 SECONDS
+ produced_reagent = /datum/reagent/yuck/cursed_soup
+ required_items = list(/obj/item/reagent_containers/food/snacks/produce/jacksberry/poison = 1)
+
+/datum/pot_recipe/yuck_soup/poo
+ required_items = list(/obj/item/natural/poo = 1)
+
+/datum/pot_recipe/yuck_soup/toxicshrooms
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/toxicshrooms = 1)
+
+/datum/pot_recipe/yuck_soup/worms
+ required_items = list(/obj/item/natural/worms = 1)
+
+/datum/pot_recipe/yuck_soup/rotten_food
+ required_items = list(/obj/item/reagent_containers/food/snacks/rotten = 1)
+
+/datum/pot_recipe/yuck_soup/organ
+ required_items = list(/obj/item/organ = 1)
+
+/datum/pot_recipe/yuck_soup/spider
+ required_items = list(/obj/item/reagent_containers/food/snacks/rogue/meat/spider = 1)
+ fallback = TRUE
+
+/datum/pot_recipe/yuck_soup/living_rat
+ required_items = list(/obj/item/reagent_containers/food/snacks/smallrat = 1)
+ fallback = TRUE
diff --git a/modular/Neu_Food/code/raw/NeuFood_dough.dm b/modular/Neu_Food/code/raw/NeuFood_dough.dm
index a897c60422..2840d9a896 100644
--- a/modular/Neu_Food/code/raw/NeuFood_dough.dm
+++ b/modular/Neu_Food/code/raw/NeuFood_dough.dm
@@ -813,6 +813,7 @@
name = "uncooked prezzel"
icon_state = "prezzel_raw"
cooked_type = /obj/item/reagent_containers/food/snacks/rogue/prezzel
+ cooked_smell = /datum/pollutant/food/prezzel
w_class = WEIGHT_CLASS_NORMAL
eat_effect = null
rotprocess = SHELFLIFE_LONG
@@ -925,6 +926,7 @@
icon_state = "cheesecakeuncook"
slices_num = 0
cooked_type = /obj/item/reagent_containers/food/snacks/rogue/ccake
+ cooked_smell = /datum/pollutant/food/cheese_cake
list_reagents = list(/datum/reagent/consumable/nutriment = 1)
foodtype = GRAIN | DAIRY | SUGAR
w_class = WEIGHT_CLASS_NORMAL
diff --git a/modular/Neu_Food/code/raw/NeuFood_meat.dm b/modular/Neu_Food/code/raw/NeuFood_meat.dm
index 8350cf5c61..28590ebfdd 100644
--- a/modular/Neu_Food/code/raw/NeuFood_meat.dm
+++ b/modular/Neu_Food/code/raw/NeuFood_meat.dm
@@ -171,7 +171,7 @@
ingredient_size = 1
fried_type = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage/cooked/wiener
cooked_type = /obj/item/reagent_containers/food/snacks/rogue/meat/sausage/cooked/wiener
- cooked_smell = /datum/pollutant/food/sausage
+ cooked_smell = /datum/pollutant/food/wiener
become_rot_type = /obj/item/reagent_containers/food/snacks/rotten/sausage
diff --git a/stonekeep.dme b/stonekeep.dme
index 840982794d..55957e77a9 100644
--- a/stonekeep.dme
+++ b/stonekeep.dme
@@ -1046,8 +1046,10 @@
#include "code\game\objects\items\tools\wirecutters.dm"
#include "code\game\objects\items\tools\wrench.dm"
#include "code\game\objects\lighting\_base_light.dm"
+#include "code\game\objects\lighting\_base_roguelight.dm"
+#include "code\game\objects\lighting\_base_roguestreet.dm"
#include "code\game\objects\lighting\lantern_post.dm"
-#include "code\game\objects\lighting\roguelighting.dm"
+#include "code\game\objects\lighting\rogue_fires.dm"
#include "code\game\objects\lighting\sunlight.dm"
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barricades.dm"