diff --git a/code/__defines/color.dm b/code/__defines/color.dm
index e7afdf9121..9c9e5c97b0 100644
--- a/code/__defines/color.dm
+++ b/code/__defines/color.dm
@@ -91,6 +91,7 @@
#define COLOR_DARK_TEAL "#2db5b5"
#define COLOR_LIGHT_VIOLET "#e7bfff"
#define COLOR_SAN_MARINO_BLUE "#4b75ab"
+#define COLOR_FIRE_ORANGE "#ff9933"
#define PIPE_COLOR_GREY "#808080"
#define PIPE_COLOR_RED "#ff0000"
@@ -168,4 +169,4 @@
#define COLOR_WEBHOOK_DEFAULT 0x8bbbd5 // "#8bbbd5"
#define COLOR_WEBHOOK_GOOD 0x2ECC71 // "#2ECC71"
#define COLOR_WEBHOOK_POOR 0xE67E22 // "#E67E22"
-#define COLOR_WEBHOOK_BAD 0xE74C3C // "#E74C3C"
\ No newline at end of file
+#define COLOR_WEBHOOK_BAD 0xE74C3C // "#E74C3C"
diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm
index 2f5f257001..98d888121b 100644
--- a/code/__defines/materials.dm
+++ b/code/__defines/materials.dm
@@ -14,7 +14,7 @@
#define MAT_WOOD "wood"
#define MAT_LOG "log"
#define MAT_SIFWOOD "alien wood"
-#define MAT_SIFLOG "alien log"
+#define MAT_SIFLOG "sifwood log"
#define MAT_STEELHULL "steel hull"
#define MAT_PLASTEEL "plasteel"
#define MAT_PLASTEELHULL "plasteel hull"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 53eb3d5fcf..249d0760b6 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -213,7 +213,9 @@
size = "bulky"
if(ITEMSIZE_HUGE)
size = "huge"
- return ..(user, "", "It is a [size] item.")
+ . = ..(user, "", "It is a [size] item.")
+ if(drying_wetness > 0 && drying_wetness != initial(drying_wetness))
+ . += "\The [src] is [get_dryness_text()]."
/obj/item/attack_hand(mob/living/user as mob)
if (!user) return
diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm
index 9af46a1e5a..26d44c7e30 100644
--- a/code/game/objects/items/weapons/tools/weldingtool.dm
+++ b/code/game/objects/items/weapons/tools/weldingtool.dm
@@ -34,7 +34,7 @@
usesound = 'sound/items/Welder2.ogg'
var/change_icons = TRUE
var/flame_intensity = 2 //how powerful the emitted light is when used.
- var/flame_color = "#FF9933" // What color the welder light emits when its on. Default is an orange-ish color.
+ var/flame_color = COLOR_FIRE_ORANGE // What color the welder light emits when its on. Default is an orange-ish color.
var/eye_safety_modifier = 0 // Increasing this will make less eye protection needed to stop eye damage. IE at 1, sunglasses will fully protect.
var/burned_fuel_for = 0 // Keeps track of how long the welder's been on, used to gradually empty the welder if left one, without RNG.
var/always_process = FALSE // If true, keeps the welder on the process list even if it's off. Used for when it needs to regenerate fuel.
diff --git a/code/game/objects/items_drying.dm b/code/game/objects/items_drying.dm
index e8696ba11a..cf5552eac9 100644
--- a/code/game/objects/items_drying.dm
+++ b/code/game/objects/items_drying.dm
@@ -37,11 +37,12 @@
// Returns a string used in drying rack examine().
/obj/item/proc/get_dryness_text(var/obj/rack)
- if(drying_wetness > 20)
+ var/moistness = drying_wetness / initial(drying_wetness)
+ if(moistness > 0.65)
return "wet"
- if(drying_wetness > 10)
+ if(moistness > 0.35)
return "damp"
- if(drying_wetness)
+ if(moistness)
return "almost dry"
return "dry"
diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm
deleted file mode 100644
index 5f568ba0d1..0000000000
--- a/code/game/objects/structures/bonfire.dm
+++ /dev/null
@@ -1,454 +0,0 @@
-/obj/structure/bonfire
- name = "bonfire"
- desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things."
- icon = 'icons/obj/structures.dmi'
- icon_state = "bonfire"
- density = FALSE
- anchored = TRUE
- buckle_lying = FALSE
- layer = TURF_LAYER + 0.5 // We want it to layer underneath food and things on top of it.
-
- var/burning = FALSE
- var/next_fuel_consumption = 0 // world.time of when next item in fuel list gets eatten to sustain the fire.
- var/grill = FALSE
- var/datum/material/material
- var/set_temperature = T0C + 30 //K
- var/heating_power = 80000
- var/datum/looping_sound/fire_crackles/fire_loop
- var/datum/looping_sound/grill/grill_loop // Used when food is cooking on the fire.
-
-/obj/structure/bonfire/Initialize(var/ml, material_name)
- . = ..()
- fire_loop = new(list(src), FALSE)
- grill_loop = new(list(src), FALSE)
- if(!material_name)
- material_name = MAT_WOOD
- material = get_material_by_name("[material_name]")
- if(!material)
- qdel(src)
- return
- color = material.icon_colour
-
-/obj/structure/bonfire/sifwood/Destroy()
- QDEL_NULL(fire_loop)
- QDEL_NULL(grill_loop)
- return ..()
-
-// Blue wood.
-/obj/structure/bonfire/sifwood/Initialize(var/ml, material_name)
- . = ..(ml, MAT_SIFWOOD)
-
-/obj/structure/bonfire/permanent/Initialize(var/ml, material_name)
- . = ..()
- ignite()
-
-/obj/structure/bonfire/permanent/sifwood/Initialize(var/ml, material_name)
- . = ..(ml, MAT_SIFWOOD)
-
-/obj/structure/bonfire/attackby(obj/item/W, mob/user)
-
- // Place food on the grill.
- if(istype(W, /obj/item/reagent_containers/food/snacks) && grill)
- if(user.unEquip(W))
- W.dropInto(loc)
- // Place it on top of the grill.
- W.pixel_x = 0
- W.pixel_y = 12
- return TRUE
-
- if(istype(W, /obj/item/stack/rods) && !can_buckle && !grill)
- var/obj/item/stack/rods/R = W
- var/choice = input(user, "What would you like to construct?", "Bonfire") as null|anything in list("Stake","Grill")
- if(!choice || user.incapacitated() || !Adjacent(user))
- return TRUE
- switch(choice)
- if("Stake")
- R.use(1)
- can_buckle = TRUE
- buckle_require_restraints = TRUE
- to_chat(user, "You add a rod to \the [src].")
- var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/structures.dmi', "bonfire_rod")
- rod_underlay.pixel_y = 16
- rod_underlay.appearance_flags = RESET_COLOR | PIXEL_SCALE | TILE_BOUND | KEEP_APART
- underlays += rod_underlay
- if("Grill")
- R.use(1)
- grill = TRUE
- to_chat(user, "You add a grill to \the [src].")
- update_icon()
- return TRUE
-
- if(istype(W, /obj/item/stack/material/fuel/wood) || istype(W, /obj/item/stack/material/fuel/log) )
- add_fuel(W, user)
- return TRUE
-
- if(W.is_hot())
- ignite()
- return TRUE
-
- return ..()
-
-/obj/structure/bonfire/attack_hand(mob/user)
- if(has_buckled_mobs())
- return ..()
-
- if(get_fuel_amount())
- remove_fuel(user)
- else
- dismantle(user)
-
-
-/obj/structure/bonfire/proc/dismantle(mob/user)
- if(!burning)
- user.visible_message("[user] starts dismantling \the [src].", "You start dismantling \the [src].")
- if(do_after(user, 5 SECONDS))
- for(var/i = 1 to 5)
- material.place_dismantled_product(get_turf(src))
- user.visible_message("[user] dismantles down \the [src].", "You dismantle \the [src].")
- qdel(src)
- else
- to_chat(user, "\The [src] is still burning. Extinguish it first if you want to dismantle it.")
-
-/obj/structure/bonfire/proc/get_fuel_amount()
- var/F = 0
- for(var/A in contents)
- if(istype(A, /obj/item/stack/material/fuel/wood))
- F += 0.5
- if(istype(A, /obj/item/stack/material/fuel/log))
- F += 1.0
- return F
-
-/obj/structure/bonfire/permanent/get_fuel_amount()
- return 10
-
-/obj/structure/bonfire/proc/remove_fuel(mob/user)
- if(get_fuel_amount())
- var/atom/movable/AM = pop(contents)
- AM.forceMove(get_turf(src))
- to_chat(user, "You take \the [AM] out of \the [src] before it has a chance to burn away.")
- update_icon()
-
-/obj/structure/bonfire/permanent/remove_fuel(mob/user)
- dismantle(user)
-
-/obj/structure/bonfire/proc/add_fuel(atom/movable/new_fuel, mob/user)
- if(get_fuel_amount() >= 10)
- to_chat(user, "\The [src] already has enough fuel!")
- return FALSE
- if(istype(new_fuel, /obj/item/stack/material/fuel/wood) || istype(new_fuel, /obj/item/stack/material/fuel/log) )
- var/obj/item/stack/F = new_fuel
- var/obj/item/stack/S = F.split(1)
- if(S)
- S.forceMove(src)
- to_chat(user, "You add \the [new_fuel] to \the [src].")
- update_icon()
- return TRUE
- return FALSE
- else
- to_chat(user, "\The [src] needs raw wood to burn, \a [new_fuel] won't work.")
- return FALSE
-
-/obj/structure/bonfire/permanent/add_fuel(mob/user)
- to_chat(user, "\The [src] has plenty of fuel and doesn't need more fuel.")
-
-/obj/structure/bonfire/proc/consume_fuel(var/obj/item/stack/consumed_fuel)
- if(!istype(consumed_fuel))
- qdel(consumed_fuel) // Don't know, don't care.
- return FALSE
-
- if(istype(consumed_fuel, /obj/item/stack/material/fuel/log))
- next_fuel_consumption = world.time + 2 MINUTES
- qdel(consumed_fuel)
- update_icon()
- return TRUE
-
- else if(istype(consumed_fuel, /obj/item/stack/material/fuel/wood)) // One log makes two planks of wood.
- next_fuel_consumption = world.time + 1 MINUTE
- qdel(consumed_fuel)
- update_icon()
- return TRUE
- return FALSE
-
-/obj/structure/bonfire/permanent/consume_fuel()
- return TRUE
-
-/obj/structure/bonfire/proc/check_oxygen()
- var/datum/gas_mixture/G = loc.return_air()
- if(G.gas["oxygen"] < 1)
- return FALSE
- return TRUE
-
-
-/obj/structure/bonfire/proc/extinguish()
- if(burning)
- burning = FALSE
- update_icon()
- STOP_PROCESSING(SSobj, src)
- visible_message("\The [src] stops burning.")
- if(fire_loop?.started)
- fire_loop.stop(src)
-
-/obj/structure/bonfire/proc/ignite()
- if(!burning && get_fuel_amount())
- burning = TRUE
- update_icon()
- START_PROCESSING(SSobj, src)
- visible_message("\The [src] starts burning!")
- if(fire_loop && !fire_loop.started)
- fire_loop.start(src)
-
-/obj/structure/bonfire/proc/burn()
- var/turf/current_location = get_turf(src)
- current_location.hotspot_expose(1000, 500)
- for(var/A in current_location)
- if(A == src)
- continue
- if(isobj(A))
- var/obj/O = A
- O.fire_act(null, 1000, 500)
- else if(isliving(A) && get_fuel_amount() > 4)
- var/mob/living/L = A
- L.adjust_fire_stacks(get_fuel_amount() / 4)
- L.IgniteMob()
-
-/obj/structure/bonfire/update_icon()
- cut_overlays()
- if(burning)
- var/state
- switch(get_fuel_amount())
- if(0 to 4.5)
- state = "bonfire_warm"
- if(4.6 to 10)
- state = "bonfire_hot"
- var/image/I = image(icon, state)
- I.appearance_flags = RESET_COLOR | KEEP_APART
- add_overlay(I)
-
- if(has_buckled_mobs() && get_fuel_amount() >= 5)
- I = image(icon, "bonfire_intense")
- I.pixel_y = 13
- I.layer = MOB_LAYER + 0.1
- I.appearance_flags = RESET_COLOR | KEEP_APART
- add_overlay(I)
-
- var/light_strength = max(get_fuel_amount() / 2, 2)
- set_light(light_strength, light_strength, "#FF9933")
- else
- set_light(0)
-
- if(grill)
- var/image/grille_image = image(icon, "bonfire_grill")
- grille_image.appearance_flags = RESET_COLOR | KEEP_APART
- add_overlay(grille_image)
-
-/obj/structure/bonfire/process()
- if(!check_oxygen())
- extinguish()
- return
- if(world.time >= next_fuel_consumption)
- if(!consume_fuel(pop(contents)))
- extinguish()
- return
-
- var/do_grill_sound = FALSE
- if(grill)
- for(var/obj/item/thing in view(2, src))
- if(thing.dry_out(src, 3 - get_dist(thing, src), (thing.loc == loc), silent = TRUE))
- do_grill_sound = TRUE
- else
- burn()
-
- if(grill_loop)
- if(do_grill_sound)
- if(!grill_loop.started)
- grill_loop.start(src)
- else
- if(grill_loop.started)
- grill_loop.stop(src)
-
-
- if(!burning)
- return
- var/W = get_fuel_amount()
- if(W < 5)
- return
- var/datum/gas_mixture/env = loc.return_air()
- if(!env || abs(env.temperature - set_temperature) <= 0.1)
- return
- var/transfer_moles = 0.25 * env.total_moles
- var/datum/gas_mixture/removed = env.remove(transfer_moles)
- var/heat_transfer = removed?.get_thermal_energy_change(set_temperature)
- if(heat_transfer > 0)
- heat_transfer = min(heat_transfer, heating_power)
- removed.add_thermal_energy(heat_transfer)
- for(var/mob/living/L in view(3, src))
- L.add_modifier(/datum/modifier/endothermic, 10 SECONDS, null, TRUE)
- env.merge(removed)
-
-/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- ignite()
-
-/obj/structure/bonfire/water_act(amount)
- if(prob(amount * 10))
- extinguish()
-
-/obj/structure/bonfire/post_buckle_mob(mob/living/M)
- if(M.buckled == src) // Just buckled someone
- M.pixel_y += 13
- else // Just unbuckled someone
- M.pixel_y -= 13
- update_icon()
-
-/obj/structure/fireplace //more like a space heater than a bonfire. A cozier alternative to both.
- name = "fireplace"
- desc = "The sound of the crackling hearth reminds you of home."
- icon = 'icons/obj/structures.dmi'
- icon_state = "fireplace"
- density = TRUE
- anchored = TRUE
- var/burning = FALSE
- var/next_fuel_consumption = 0
- var/set_temperature = T0C + 20 //K
- var/heating_power = 40000
-
-/obj/structure/fireplace/attackby(obj/item/W, mob/user)
- if(istype(W, /obj/item/stack/material/fuel/wood) || istype(W, /obj/item/stack/material/fuel/log) )
- add_fuel(W, user)
-
- else if(W.is_hot())
- ignite()
- else
- return ..()
-
-/obj/structure/fireplace/attack_hand(mob/user)
- if(get_fuel_amount())
- remove_fuel(user)
-
-/obj/structure/fireplace/proc/get_fuel_amount()
- var/F = 0
- for(var/A in contents)
- if(istype(A, /obj/item/stack/material/fuel/wood))
- F += 0.5
- if(istype(A, /obj/item/stack/material/fuel/log))
- F += 1.0
- return F
-
-/obj/structure/fireplace/proc/remove_fuel(mob/user)
- if(get_fuel_amount())
- var/atom/movable/AM = pop(contents)
- AM.forceMove(get_turf(src))
- to_chat(user, "You take \the [AM] out of \the [src] before it has a chance to burn away.")
- update_icon()
-
-/obj/structure/fireplace/proc/add_fuel(atom/movable/new_fuel, mob/user)
- if(get_fuel_amount() >= 10)
- to_chat(user, "\The [src] already has enough fuel!")
- return FALSE
- if(istype(new_fuel, /obj/item/stack/material/fuel/wood) || istype(new_fuel, /obj/item/stack/material/fuel/log) )
- var/obj/item/stack/F = new_fuel
- var/obj/item/stack/S = F.split(1)
- if(S)
- S.forceMove(src)
- to_chat(user, "You add \the [new_fuel] to \the [src].")
- update_icon()
- return TRUE
- return FALSE
- else
- to_chat(user, "\The [src] needs raw wood to burn, \a [new_fuel] won't work.")
- return FALSE
-
-/obj/structure/fireplace/proc/consume_fuel(var/obj/item/stack/consumed_fuel)
-
- if(!istype(consumed_fuel, /obj/item/stack/material/fuel))
- qdel(consumed_fuel) // Don't know, don't care.
- return FALSE
-
- var/obj/item/stack/material/fuel/fuel_stack = consumed_fuel
- next_fuel_consumption = world.time + max(1 MINUTE, fuel_stack + bonfire_fuel_time)
- fuel_stack.use(1)
- update_icon()
- return TRUE
-
-
-/obj/structure/fireplace/proc/check_oxygen()
- var/datum/gas_mixture/G = loc.return_air()
- if(G.gas["oxygen"] < 1)
- return FALSE
- return TRUE
-
-/obj/structure/fireplace/proc/extinguish()
- if(burning)
- burning = FALSE
- update_icon()
- STOP_PROCESSING(SSobj, src)
- visible_message("\The [src] stops burning.")
-
-/obj/structure/fireplace/proc/ignite()
- if(!burning && get_fuel_amount())
- burning = TRUE
- update_icon()
- START_PROCESSING(SSobj, src)
- visible_message("\The [src] starts burning!")
-
-/obj/structure/fireplace/proc/burn()
- var/turf/current_location = get_turf(src)
- current_location.hotspot_expose(1000, 500)
- for(var/A in current_location)
- if(A == src)
- continue
- if(isobj(A))
- var/obj/O = A
- O.fire_act(null, 1000, 500)
-
-/obj/structure/fireplace/update_icon()
- cut_overlays()
- if(burning)
- var/state
- switch(get_fuel_amount())
- if(0 to 3.5)
- state = "fireplace_warm"
- if(3.6 to 6.5)
- state = "fireplace_hot"
- if(6.6 to 10)
- state = "fireplace_intense" //don't need to throw a corpse inside to make it burn hotter.
- var/image/I = image(icon, state)
- I.appearance_flags = RESET_COLOR | KEEP_APART
- add_overlay(I)
-
- var/light_strength = max(get_fuel_amount() / 2, 2)
- set_light(light_strength, light_strength, "#FF9933")
- else
- set_light(0)
-
-/obj/structure/fireplace/process()
- if(!check_oxygen())
- extinguish()
- return
- if(world.time >= next_fuel_consumption)
- if(!consume_fuel(pop(contents)))
- extinguish()
- return
-
- if(burning)
- var/W = get_fuel_amount()
- if(W >= 5)
- var/datum/gas_mixture/env = loc.return_air()
- if(env && abs(env.temperature - set_temperature) > 0.1)
- var/transfer_moles = 0.25 * env.total_moles
- var/datum/gas_mixture/removed = env.remove(transfer_moles)
-
- if(removed)
- var/heat_transfer = removed.get_thermal_energy_change(set_temperature)
- if(heat_transfer > 0)
- heat_transfer = min(heat_transfer , heating_power)
-
- removed.add_thermal_energy(heat_transfer)
-
- env.merge(removed)
-
-/obj/structure/fireplace/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- ignite()
-
-/obj/structure/fireplace/water_act(amount)
- if(prob(amount * 10))
- extinguish()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index e1c4e314e9..e3106676a4 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -603,3 +603,10 @@
/obj/structure/bed/chair/sofa/orange/corner
icon_state = "sofacorner"
+
+// Sivian wood subtype for mapping.
+/obj/structure/bed/chair/sifwood/Initialize(var/ml, var/newmaterial)
+ . = ..(ml, MAT_SIFWOOD)
+
+/obj/structure/bed/chair/sifwood/wings
+ icon_state = "wooden_chair_wings"
diff --git a/code/game/objects/structures/wood_fire.dm b/code/game/objects/structures/wood_fire.dm
new file mode 100644
index 0000000000..f9b7dfb33f
--- /dev/null
+++ b/code/game/objects/structures/wood_fire.dm
@@ -0,0 +1,389 @@
+/obj/structure/wood_fire // abstract type, do not use
+
+ icon = 'icons/obj/wood_fire.dmi'
+ density = FALSE
+ anchored = TRUE
+ buckle_lying = FALSE
+ layer = TURF_LAYER + 0.5 // We want it to layer underneath food and things on top of it.
+
+ var/base_icon_state = "bonfire"
+ var/can_dismantle = TRUE
+ var/burning = FALSE
+ var/next_fuel_consumption = 0 // world.time of when next item in fuel list gets eatten to sustain the fire.
+ var/grill = FALSE
+ var/set_temperature = T0C + 30 //K
+ var/heating_power = 80000
+ var/datum/looping_sound/fire_crackles/fire_loop
+ var/datum/looping_sound/grill/grill_loop // Used when food is cooking on the fire.
+
+/obj/structure/wood_fire/Initialize()
+ . = ..()
+ fire_loop = new(list(src), FALSE)
+ grill_loop = new(list(src), FALSE)
+
+/obj/structure/wood_fire/Destroy()
+ QDEL_NULL(fire_loop)
+ QDEL_NULL(grill_loop)
+ return ..()
+
+/obj/structure/wood_fire/proc/get_upgrade_options()
+ if(!grill)
+ LAZYADD(., "Grill")
+ else if(!can_buckle)
+ LAZYADD(., "Stake")
+
+/obj/structure/wood_fire/proc/try_build_feature(var/mob/user, var/obj/item/stack/rods/rods)
+ if(!istype(rods))
+ return FALSE
+
+ var/list/upgrade_options = get_upgrade_options()
+ var/choice
+ if(!length(upgrade_options))
+ return FALSE
+
+ if(length(upgrade_options) == 1)
+ choice = upgrade_options[1]
+ else
+ choice = input(user, "What would you like to construct?", "Constructing Grill") as null|anything in upgrade_options
+ if(QDELETED(rods) || rods.get_amount() < 1 || user.incapacitated() || !Adjacent(user))
+ return TRUE
+
+ switch(choice)
+ if("Stake")
+ rods.use(1)
+ can_buckle = TRUE
+ buckle_require_restraints = TRUE
+ to_chat(user, SPAN_NOTICE("You add a rod to \the [src]."))
+ if("Grill")
+ rods.use(1)
+ grill = TRUE
+ to_chat(user, SPAN_NOTICE("You add a grill to \the [src]."))
+ else
+ return TRUE
+ update_icon()
+ return TRUE
+
+/obj/structure/wood_fire/attackby(obj/item/W, mob/user)
+
+ // Place food on the grill.
+ if(istype(W, /obj/item/reagent_containers/food/snacks) && grill)
+ if(user.unEquip(W))
+ W.dropInto(loc)
+ // Place it on top of the grill.
+ W.pixel_x = 0
+ W.pixel_y = 12
+ return TRUE
+
+ if(try_build_feature(user, W))
+ return TRUE
+
+ if(istype(W, /obj/item/stack/material/fuel))
+ add_fuel(W, user)
+ return TRUE
+
+ if(W.is_hot())
+ ignite()
+ return TRUE
+
+ return ..()
+
+/obj/structure/wood_fire/attack_hand(mob/user)
+ if(!has_buckled_mobs())
+ if(get_fuel_amount())
+ remove_fuel(user)
+ return TRUE
+ if(can_dismantle)
+ dismantle(user)
+ return TRUE
+ return ..()
+
+/obj/structure/wood_fire/proc/dismantle(mob/user)
+ if(!burning)
+ user.visible_message("[user] starts dismantling \the [src].", "You start dismantling \the [src].")
+ if(do_after(user, 5 SECONDS))
+ for(var/obj/item/thing in contents)
+ thing.dropInto(loc)
+ user.visible_message("[user] dismantles down \the [src].", "You dismantle \the [src].")
+ qdel(src)
+ else
+ to_chat(user, SPAN_WARNING("\The [src] is still burning. Extinguish it first if you want to dismantle it."))
+
+/obj/structure/wood_fire/proc/get_fuel_amount()
+ . = 0
+ for(var/obj/item/stack/material/fuel/fuel in contents)
+ . += (fuel.amount * fuel.bonfire_fuel_time) / (2 MINUTES)
+
+/obj/structure/wood_fire/proc/remove_fuel(mob/user)
+ if(!get_fuel_amount())
+ return
+ var/atom/movable/AM = pop(contents)
+ if(!istype(AM))
+ return
+ AM.forceMove(get_turf(src))
+ to_chat(user, SPAN_NOTICE("You take \the [AM] out of \the [src] before it has a chance to burn away."))
+ update_icon()
+
+/obj/structure/wood_fire/proc/add_fuel(atom/movable/new_fuel, mob/user)
+ if(get_fuel_amount() >= 10)
+ to_chat(user, SPAN_WARNING("\The [src] already has enough fuel!"))
+ return FALSE
+ if(istype(new_fuel, /obj/item/stack/material/fuel/wood) || istype(new_fuel, /obj/item/stack/material/fuel/log) )
+ var/obj/item/stack/F = new_fuel
+ var/obj/item/stack/S = F.split(1)
+ if(S)
+ S.forceMove(src)
+ to_chat(user, SPAN_WARNING("You add \the [new_fuel] to \the [src]."))
+ update_icon()
+ return TRUE
+ return FALSE
+ else
+ to_chat(user, SPAN_WARNING("\The [src] needs raw wood to burn, \a [new_fuel] won't work."))
+ return FALSE
+
+/obj/structure/wood_fire/proc/consume_fuel()
+ var/obj/item/stack/consumed_fuel
+ for(var/atom/movable/thing in contents)
+ if(!thing.simulated)
+ continue
+ consumed_fuel = thing
+ break
+ if(!istype(consumed_fuel, /obj/item/stack/material/fuel))
+ if(consumed_fuel)
+ qdel(consumed_fuel) // Don't know, don't care.
+ return FALSE
+ var/obj/item/stack/material/fuel/fuel_stack = consumed_fuel
+ next_fuel_consumption = world.time + max(1 MINUTE, fuel_stack.bonfire_fuel_time)
+ fuel_stack.use(1)
+ update_icon()
+ return TRUE
+
+/obj/structure/wood_fire/proc/extinguish()
+ if(!burning)
+ return
+ burning = FALSE
+ update_icon()
+ STOP_PROCESSING(SSobj, src)
+ visible_message(SPAN_NOTICE("\The [src] stops burning."))
+ if(fire_loop?.started)
+ fire_loop.stop(src)
+
+/obj/structure/wood_fire/proc/ignite()
+ if(burning || !get_fuel_amount())
+ return
+ burning = TRUE
+ update_icon()
+ START_PROCESSING(SSobj, src)
+ visible_message(SPAN_NOTICE("\The [src] starts burning!"))
+ if(fire_loop && !fire_loop.started)
+ fire_loop.start(src)
+
+/obj/structure/wood_fire/proc/get_fuel_overlay(var/fuel_amount)
+ if(fuel_amount)
+ var/image/I = image(icon, "[base_icon_state]_fuelled")
+ I.appearance_flags = RESET_COLOR | KEEP_APART
+ var/obj/item/stack/material/fuel/fuel = locate() in contents
+ I.color = fuel?.material?.icon_colour
+ return I
+
+/obj/structure/wood_fire/update_icon()
+
+ cut_overlays()
+
+ // Draw our fuel overlay and colour it based on fuel material.
+ var/fuel_amount = get_fuel_amount()
+ var/fuel_overlay = get_fuel_overlay(fuel_amount)
+ if(fuel_overlay)
+ if(islist(fuel_overlay))
+ for(var/overlay in fuel_overlay)
+ add_overlay(overlay)
+ else
+ add_overlay(fuel_overlay)
+
+ if(burning)
+
+ // Draw our actual fire icon.
+ var/fire_state
+ if(fuel_amount >= 10)
+ fire_state = "[base_icon_state]_intense"
+ else if(fuel_amount >= 5)
+ fire_state = "[base_icon_state]_hot"
+ else
+ fire_state = "[base_icon_state]_warm"
+ var/image/I = image(icon, fire_state)
+ I.appearance_flags = RESET_COLOR | KEEP_APART
+ add_overlay(I)
+
+ // If we're capable of burning buckled mobs (usually via a stake),
+ // draw a second intense fire overlay and offset it to cover the mob.
+ if(fire_is_burning_mobs())
+ I = image(icon, "[base_icon_state]_intense")
+ I.pixel_y = 13
+ I.layer = MOB_LAYER + 0.1
+ I.appearance_flags = RESET_COLOR | KEEP_APART
+ add_overlay(I)
+
+ // Update our lights.
+ var/light_strength = max(fuel_amount / 2, 2)
+ set_light(light_strength, light_strength, COLOR_FIRE_ORANGE)
+ else
+ set_light(0)
+
+ if(grill)
+ var/image/grille_image = image(icon, "[base_icon_state]_grill")
+ grille_image.appearance_flags = RESET_COLOR | KEEP_APART
+ add_overlay(grille_image)
+
+ underlays.Cut()
+ if(can_buckle)
+ var/mutable_appearance/rod_underlay = mutable_appearance('icons/obj/structures.dmi', "[base_icon_state]_rod")
+ rod_underlay.pixel_y = 16
+ rod_underlay.appearance_flags = RESET_COLOR | PIXEL_SCALE | TILE_BOUND | KEEP_APART
+ underlays += rod_underlay
+
+
+/obj/structure/wood_fire/proc/fire_is_burning_mobs()
+ return has_buckled_mobs() && get_fuel_amount() >= 5
+
+/obj/structure/wood_fire/process()
+
+ // Are we even alight?
+ if(!burning)
+ return
+
+ // Should we even be alight?
+ var/datum/gas_mixture/env = loc?.return_air()
+ if(env?.gas["oxygen"] < 1 || (world.time >= next_fuel_consumption && !consume_fuel()))
+ extinguish()
+ return
+
+ // Ignite anything sitting on the same turf as us.
+ if(isturf(loc))
+ var/turf/current_turf = loc
+ current_turf.hotspot_expose(1000, 500)
+
+ // See if we can dry out anything around us, or cook any food.
+ var/grilling = FALSE
+ for(var/obj/item/thing in view(2, src))
+ var/on_top_of_fire = thing.loc == loc
+ if(on_top_of_fire)
+ if(!grilling && istype(thing, /obj/item/reagent_containers/food/snacks))
+ grilling = TRUE
+ if(!grill)
+ thing.fire_act(null, 1000, 500)
+ continue
+ thing.dry_out(src, max(1, 3 - get_dist(thing, src)), on_top_of_fire)
+
+ // If we're cooking food, play a food cooking souond.
+ if(grilling)
+ if(grill_loop)
+ if(locate(/obj/item/reagent_containers/food/snacks) in contents)
+ if(!grill_loop.started)
+ grill_loop.start(src)
+ else
+ if(grill_loop.started)
+ grill_loop.stop(src)
+
+ // If we're low enough, don't burn anything or put out
+ // any significant heat, they need to refuel the fire.
+ var/fuel_amount = get_fuel_amount()
+ if(fuel_amount < 5)
+ return
+
+ // Burn anything standing on our turf.
+ var/adj_fuel_amount = fuel_amount / 4
+ for(var/mob/living/victim in loc)
+ victim.adjust_fire_stacks(adj_fuel_amount / 4)
+ victim.IgniteMob()
+
+ // Heat up our environment.
+ if(!env || abs(env.temperature - set_temperature) <= 0.1)
+ return
+ var/transfer_moles = 0.25 * env.total_moles
+ var/datum/gas_mixture/removed = env.remove(transfer_moles)
+ var/heat_transfer = removed?.get_thermal_energy_change(set_temperature)
+ if(heat_transfer > 0)
+ heat_transfer = min(heat_transfer, heating_power)
+ removed.add_thermal_energy(heat_transfer)
+ for(var/mob/living/L in view(3, src))
+ L.add_modifier(/datum/modifier/endothermic, 10 SECONDS, null, TRUE)
+ env.merge(removed)
+
+/obj/structure/wood_fire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ ignite()
+
+/obj/structure/wood_fire/water_act(amount)
+ if(prob(amount * 10))
+ extinguish()
+
+/obj/structure/wood_fire/post_buckle_mob(mob/living/M)
+ if(M.buckled == src) // Just buckled someone
+ M.pixel_y += 13
+ else // Just unbuckled someone
+ M.pixel_y -= 13
+ update_icon()
+
+// A freestanding fire for cooking food on.
+/obj/structure/wood_fire/bonfire
+ name = "bonfire"
+ desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things."
+ icon_state = "bonfire"
+
+// Pre-fuelled for recipes/maps.
+/obj/structure/wood_fire/bonfire/fuelled/Initialize()
+ . = ..()
+ for(var/i = 1 to 5)
+ new /obj/item/stack/material/fuel/log(src)
+ update_icon()
+
+// Blue wood.
+/obj/structure/wood_fire/bonfire/sifwood/Initialize()
+ . = ..()
+ for(var/i = 1 to 5)
+ new /obj/item/stack/material/fuel/log/sif(src)
+ update_icon()
+
+// A smaller bonfire.
+/obj/structure/wood_fire/campfire
+ name = "campfire"
+ desc = "A small firepit for camping. Did anyone bring the marshmallows?"
+ icon_state = "campfire"
+ base_icon_state = "campfire"
+ can_dismantle = FALSE
+ can_buckle = FALSE
+ set_temperature = T0C + 20 //K
+ heating_power = 40000
+
+/obj/structure/wood_fire/campfire/get_upgrade_options()
+ if(!grill)
+ return list("Grill")
+
+// more like a space heater than a bonfire. A cozier alternative to both.
+/obj/structure/wood_fire/fireplace
+ name = "fireplace"
+ desc = "The sound of the crackling hearth reminds you of home."
+ icon_state = "fireplace"
+ base_icon_state = "fireplace"
+ density = TRUE
+ set_temperature = T0C + 20 //K
+ heating_power = 40000
+ can_dismantle = FALSE
+ can_buckle = FALSE
+ grill = TRUE
+
+/obj/structure/wood_fire/fireplace/get_upgrade_options()
+ if(!grill)
+ return list("Grill")
+
+/obj/structure/wood_fire/fireplace/stove
+ name = "stove"
+ desc = "A rustic, soot-stained wood-fired stove. Better check your CO detector."
+ grill = FALSE
+ icon_state = "stove"
+ base_icon_state = "stove"
+
+/obj/structure/wood_fire/fireplace/stove/get_upgrade_options()
+ return
+
+/obj/structure/wood_fire/fireplace/stove/get_fuel_overlay(var/fuel_amount)
+ . = ..()
+ LAZYADD(., "[base_icon_state]_cover")
diff --git a/code/modules/ai/ai_holder_debug.dm b/code/modules/ai/ai_holder_debug.dm
index 88b604b67a..bad6415714 100644
--- a/code/modules/ai/ai_holder_debug.dm
+++ b/code/modules/ai/ai_holder_debug.dm
@@ -49,21 +49,21 @@
var/new_color = null
switch(stance)
if(STANCE_SLEEP)
- new_color = "#FFFFFF" // White
+ new_color = "#ffffff" // White
if(STANCE_IDLE)
- new_color = "#00FF00" // Green
+ new_color = "#00ff00" // Green
if(STANCE_ALERT)
- new_color = "#FFFF00" // Yellow
+ new_color = "#ffff00" // Yellow
if(STANCE_APPROACH)
- new_color = "#FF9933" // Orange
+ new_color = "#ff9933" // Orange
if(STANCE_FIGHT)
- new_color = "#FF0000" // Red
+ new_color = "#ff0000" // Red
if(STANCE_MOVE)
- new_color = "#0000FF" // Blue
+ new_color = "#0000ff" // Blue
if(STANCE_REPOSITION)
- new_color = "#FF00FF" // Purple
+ new_color = "#ff00ff" // Purple
if(STANCE_FOLLOW)
- new_color = "#00FFFF" // Cyan
+ new_color = "#00ffff" // Cyan
if(STANCE_FLEE)
new_color = "#666666" // Grey
if(STANCE_DISABLED)
diff --git a/code/modules/effects/vfx/smoke.dm b/code/modules/effects/vfx/smoke.dm
index 85a42a3e70..0741bfa496 100644
--- a/code/modules/effects/vfx/smoke.dm
+++ b/code/modules/effects/vfx/smoke.dm
@@ -90,11 +90,11 @@
/obj/effect/vfx/smoke/bad/burntfood
color = "#000000"
time_to_live = 600
-
+
/obj/effect/vfx/smoke/bad/burntfood/process()
for(var/mob/living/L in get_turf(src))
affect(L)
-
+
/obj/effect/vfx/smoke/bad/burntfood/affect(var/mob/living/L) // This stuff is extra-vile.
if (!..())
return 0
@@ -132,8 +132,8 @@
/obj/effect/vfx/smoke/elemental/fire
name = "burning cloud"
desc = "A cloud of something that is on fire."
- color = "#FF9933"
- light_color = "#FF0000"
+ color = COLOR_FIRE_ORANGE
+ light_color = "#ff0000"
light_range = 2
light_power = 5
@@ -215,7 +215,7 @@
/datum/effect_system/smoke_spread/bad
smoke_type = /obj/effect/vfx/smoke/bad
-
+
/datum/effect_system/smoke_spread/bad/burntfood
smoke_type = /obj/effect/vfx/smoke/bad/burntfood
@@ -232,4 +232,4 @@
smoke_type = /obj/effect/vfx/smoke/elemental/shock
/datum/effect_system/smoke_spread/mist
- smoke_type = /obj/effect/vfx/smoke/elemental/mist
\ No newline at end of file
+ smoke_type = /obj/effect/vfx/smoke/elemental/mist
diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm
index 801707af55..4bc39bea00 100644
--- a/code/modules/food/food/condiment.dm
+++ b/code/modules/food/food/condiment.dm
@@ -482,6 +482,16 @@
desc = "An artisanal sack of flour. Classy!"
icon_state = "flour_bag"
+/obj/item/reagent_containers/food/condiment/carton/rice
+ name = "rice sack"
+ desc = "An artisanal sack of rice. Rustic!"
+ icon_state = "flour_bag"
+
+/obj/item/reagent_containers/food/condiment/carton/rice/Initialize()
+ . = ..()
+ reagents.add_reagent("rice", 200)
+ randpixel_xy()
+
/obj/item/reagent_containers/food/condiment/carton/sugar
name = "sugar carton"
desc = "A big carton of sugar. Sweet!"
diff --git a/code/modules/food/food/jerky.dm b/code/modules/food/food/jerky.dm
index d2a0a59a3a..6d589fe3b5 100644
--- a/code/modules/food/food/jerky.dm
+++ b/code/modules/food/food/jerky.dm
@@ -3,6 +3,7 @@
icon = 'icons/obj/food_jerky.dmi'
bitesize = 2
w_class = ITEMSIZE_TINY
+ dry = TRUE
/obj/item/reagent_containers/food/snacks/jerky/fish
name = "dried fish"
@@ -44,7 +45,7 @@
/obj/item/reagent_containers/food/snacks/jerky/spider
name = "dried spider meat"
desc = "A piece of green, stringy dried meat, full of tubes. It smells faintly of acid."
- icon_state = "spiderjerky"
+ icon_state = "spiderjerky_charred"
/obj/item/reagent_containers/food/snacks/jerky/spider/get_drying_state()
return "meat_dried"
@@ -53,6 +54,9 @@
. = ..()
reagents.add_reagent("protein", 5)
+/obj/item/reagent_containers/food/snacks/jerky/spider/poison
+ icon_state = "spiderjerky"
+
/obj/item/reagent_containers/food/snacks/jerky/spider/poison/Initialize()
. = ..()
reagents.add_reagent("spidertoxin", 3)
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index 85e6c963c5..e9a1930280 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -47,6 +47,16 @@
/obj/item/reagent_containers/food/snacks/is_dryable()
return !dry
+/obj/item/reagent_containers/food/snacks/get_dryness_text(var/obj/rack)
+ var/moistness = drying_wetness / initial(drying_wetness)
+ if(moistness > 0.65)
+ return "fresh"
+ if(moistness > 0.35)
+ return "somewhat dried"
+ if(moistness)
+ return "almost dried"
+ return "dehydrated"
+
/obj/item/reagent_containers/food/snacks/dry_out(var/obj/rack, var/drying_power = 1, var/fire_exposed = FALSE, var/silent = FALSE)
// If it's a direct fire, cook the food instead.
diff --git a/code/modules/materials/fifty_spawner_mats.dm b/code/modules/materials/fifty_spawner_mats.dm
index 09803bb1be..ca8682a0d9 100644
--- a/code/modules/materials/fifty_spawner_mats.dm
+++ b/code/modules/materials/fifty_spawner_mats.dm
@@ -101,7 +101,7 @@
type_to_spawn = /obj/item/stack/material/fuel/wood
/obj/fiftyspawner/sifwood
- name = "stack of alien wood"
+ name = "stack of sifwood wood"
type_to_spawn = /obj/item/stack/material/fuel/wood/sif
/obj/fiftyspawner/log
@@ -109,7 +109,7 @@
type_to_spawn = /obj/item/stack/material/fuel/log
/obj/fiftyspawner/log/sif
- name = "stack of alien logs"
+ name = "stack of sifwood logs"
type_to_spawn = /obj/item/stack/material/fuel/log/sif
/obj/fiftyspawner/cloth
diff --git a/code/modules/materials/materials/organic/wood.dm b/code/modules/materials/materials/organic/wood.dm
index 847649a975..62c31b0d56 100644
--- a/code/modules/materials/materials/organic/wood.dm
+++ b/code/modules/materials/materials/organic/wood.dm
@@ -72,10 +72,11 @@
sheet_plural_name = "pile"
pass_stack_colors = TRUE
supply_conversion_value = 1
+ var/bonfire_type = /obj/structure/wood_fire/bonfire/fuelled
/datum/material/wood/log/generate_recipes()
recipes = list(
- new /datum/stack_recipe("bonfire", /obj/structure/bonfire, 5, time = 50, supplied_material = "[name]", pass_stack_color = TRUE, recycle_material = "[name]")
+ new /datum/stack_recipe("bonfire", bonfire_type, 5, time = 5 SECONDS)
)
/datum/material/wood/log/sif
@@ -83,3 +84,4 @@
icon_colour = "#0099cc" // Cyan-ish
stack_origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 2)
stack_type = /obj/item/stack/material/fuel/log/sif
+ bonfire_type = /obj/structure/wood_fire/bonfire/sifwood
diff --git a/code/modules/materials/sheets/organic/tanning/tanning_rack.dm b/code/modules/materials/sheets/organic/tanning/tanning_rack.dm
index 2997277443..5ada3e6298 100644
--- a/code/modules/materials/sheets/organic/tanning/tanning_rack.dm
+++ b/code/modules/materials/sheets/organic/tanning/tanning_rack.dm
@@ -36,15 +36,12 @@
if(drying_state)
add_overlay(drying_state)
-/obj/structure/drying_rack/attackby(var/atom/A, var/mob/user)
- if(istype(A, /obj/item/stack/wetleather))
- if(!drying) // If not drying anything, start drying the thing
- if(user.unEquip(A, target = src))
- drying = A
- else // Drying something, add if possible
- var/obj/item/stack/wetleather/W = A
- W.transfer_to(drying, W.amount, TRUE)
- update_icon()
+/obj/structure/drying_rack/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I) && I.is_dryable() && !istype(I, /obj/item/stack/material/fuel))
+ if(user.unEquip(I))
+ I.forceMove(src)
+ drying = I
+ update_icon()
return TRUE
return ..()
diff --git a/code/modules/materials/sheets/organic/wood.dm b/code/modules/materials/sheets/organic/wood.dm
index 9ba91418ea..7e8def218d 100644
--- a/code/modules/materials/sheets/organic/wood.dm
+++ b/code/modules/materials/sheets/organic/wood.dm
@@ -1,6 +1,16 @@
/obj/item/stack/material/fuel // abstract type, do not use
var/bonfire_fuel_time = 1 MINUTE
+/obj/item/stack/material/fuel/get_dryness_text(var/obj/rack)
+ var/moistness = drying_wetness / initial(drying_wetness)
+ if(moistness > 0.65)
+ return "fresh-cut"
+ if(moistness > 0.35)
+ return "somewhat dried"
+ if(moistness)
+ return "almost dried"
+ return "dried"
+
/obj/item/stack/material/fuel/wood
name = "wooden plank"
icon_state = "sheet-wood"
@@ -27,6 +37,10 @@
drying_wetness = null
bonfire_fuel_time = 6 MINUTES
+/obj/item/stack/material/fuel/wood/dried/update_strings()
+ . = ..()
+ name = "dried [name]"
+
/obj/item/stack/material/fuel/wood/dried/sif
name = "dried sifwood plank"
color = "#0099cc"
@@ -62,6 +76,10 @@
plank_type = /obj/item/stack/material/fuel/wood/dried
bonfire_fuel_time = 8 MINUTES
+/obj/item/stack/material/fuel/log/dried/update_strings()
+ . = ..()
+ name = "dried [name]"
+
/obj/item/stack/material/fuel/log/dried/sif
name = "dried sifwood log"
default_type = MAT_SIFLOG
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index dc604cbb69..dbf9e83967 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -5,7 +5,7 @@
icon_state = "lantern"
desc = "A mining lantern."
brightness_on = 6 // luminosity when on
- light_color = "FF9933" // A slight yellow/orange color.
+ light_color = COLOR_FIRE_ORANGE
/*****************************Pickaxe********************************/
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index d76222128b..2f891699b7 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -247,7 +247,7 @@
return TRUE
else if(on_fire)
- set_light(min(round(fire_stacks), 3), round(fire_stacks), l_color = "#FF9933")
+ set_light(min(round(fire_stacks), 3), round(fire_stacks), l_color = COLOR_FIRE_ORANGE)
return TRUE
else if(glow_toggle)
diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm
index 0899922b75..d099a40626 100644
--- a/code/modules/planet/sif.dm
+++ b/code/modules/planet/sif.dm
@@ -59,7 +59,7 @@ var/global/datum/planet/sif/planet_sif = null
low_color = "#CC3300"
high_brightness = 0.9
- high_color = "#FF9933"
+ high_color = COLOR_FIRE_ORANGE
min = 0.50
if(0.70 to 1.00) // Noon
diff --git a/icons/obj/food_jerky.dmi b/icons/obj/food_jerky.dmi
index 88e9f60f90..17d64900cc 100644
Binary files a/icons/obj/food_jerky.dmi and b/icons/obj/food_jerky.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index c6810e9fb4..fdcd3c877f 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/wood_fire.dmi b/icons/obj/wood_fire.dmi
new file mode 100644
index 0000000000..d859afc6a6
Binary files /dev/null and b/icons/obj/wood_fire.dmi differ
diff --git a/maps/cynosure/cynosure-2.dmm b/maps/cynosure/cynosure-2.dmm
index 7aabe5fd98..6ff2b05215 100644
--- a/maps/cynosure/cynosure-2.dmm
+++ b/maps/cynosure/cynosure-2.dmm
@@ -21249,6 +21249,10 @@
initial_flooring = /decl/flooring/tiling/asteroidfloor
},
/area/surface/station/garage)
+"jJj" = (
+/obj/structure/wood_fire/campfire,
+/turf/simulated/floor/outdoors/dirt/sif,
+/area/surface/outside/path/plains)
"jJq" = (
/obj/machinery/computer/operating{
dir = 8
@@ -74557,7 +74561,7 @@ fyc
fyc
fyc
fyc
-fyc
+jJj
fyc
fyc
vwy
diff --git a/maps/cynosure/cynosure-7.dmm b/maps/cynosure/cynosure-7.dmm
index 645a327637..4cdd454d05 100644
--- a/maps/cynosure/cynosure-7.dmm
+++ b/maps/cynosure/cynosure-7.dmm
@@ -10,10 +10,8 @@
/turf/unsimulated/wall/planetary/sif,
/area/surface/outside/wilderness/mountains)
"bW" = (
-/obj/effect/landmark{
- name = "JoinLateWilderness"
- },
-/obj/structure/bed,
+/obj/structure/wood_fire/fireplace/stove,
+/obj/fiftyspawner/log/sif,
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
"ct" = (
@@ -29,6 +27,10 @@
/obj/vehicle/boat/sifwood,
/turf/simulated/floor/outdoors/mask,
/area/surface/outside/wilderness/normal)
+"eu" = (
+/obj/structure/simple_door/sifwood,
+/turf/simulated/floor/wood/sif,
+/area/surface/outside/wilderness/normal)
"eZ" = (
/turf/simulated/wall/sifwood,
/area/surface/wilderness/shack)
@@ -42,6 +44,10 @@
/obj/item/stack/medical/splint,
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
+"fQ" = (
+/obj/structure/kitchenspike,
+/turf/simulated/floor/outdoors/dirt/sif/planetuse,
+/area/surface/outside/wilderness/normal)
"gl" = (
/obj/structure/cliff/automatic{
dir = 9
@@ -54,6 +60,16 @@
},
/turf/simulated/floor/outdoors/mask,
/area/surface/outside/wilderness/mountains)
+"ic" = (
+/obj/structure/closet/cabinet,
+/obj/item/clothing/suit/storage/hooded/wintercoat,
+/obj/item/clothing/shoes/boots/winter,
+/obj/item/clothing/under/color/grey,
+/obj/item/clothing/mask/gas,
+/obj/item/tank/emergency/oxygen/double,
+/obj/item/melee/umbrella/random,
+/turf/simulated/floor/wood/sif,
+/area/surface/wilderness/shack)
"id" = (
/turf/simulated/wall/sifwood,
/area/surface/outside/path/wilderness)
@@ -118,7 +134,8 @@
/turf/simulated/floor/outdoors/mask,
/area/surface/outside/wilderness/mountains)
"qr" = (
-/obj/structure/kitchenspike,
+/obj/item/storage/box/matches,
+/obj/structure/table/sifwoodentable,
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
"qT" = (
@@ -139,6 +156,9 @@
},
/turf/simulated/wall/concrete,
/area/surface/outside/wilderness/normal)
+"ti" = (
+/turf/simulated/floor/outdoors/dirt/sif/planetuse,
+/area/surface/outside/wilderness/normal)
"tC" = (
/obj/structure/simple_door/sifwood,
/turf/simulated/floor/wood/sif,
@@ -184,12 +204,22 @@
/obj/effect/zone_divider,
/turf/simulated/floor/water/deep,
/area/surface/outside/river/gautelfr)
+"zq" = (
+/obj/structure/drying_rack,
+/turf/simulated/floor/outdoors/dirt/sif/planetuse,
+/area/surface/outside/wilderness/normal)
"zS" = (
/obj/structure/railing{
dir = 4
},
/turf/simulated/floor/water/deep,
/area/surface/outside/river/gautelfr)
+"zY" = (
+/obj/structure/bed/chair/sifwood/wings{
+ dir = 4
+ },
+/turf/simulated/floor/wood/sif,
+/area/surface/wilderness/shack)
"Aq" = (
/obj/effect/zone_divider,
/turf/simulated/floor/outdoors/mask,
@@ -200,6 +230,14 @@
"Ay" = (
/turf/simulated/floor/water,
/area/surface/outside/wilderness/mountains)
+"AG" = (
+/obj/structure/bed,
+/obj/effect/landmark{
+ name = "JoinLateWilderness"
+ },
+/obj/item/bedsheet/blue,
+/turf/simulated/floor/wood/sif,
+/area/surface/wilderness/shack)
"Be" = (
/obj/structure/cliff/automatic{
dir = 8
@@ -207,6 +245,12 @@
/obj/effect/zone_divider,
/turf/simulated/floor/outdoors/mask,
/area/surface/outside/wilderness/mountains)
+"BH" = (
+/obj/effect/landmark/start{
+ name = "Trained Drake"
+ },
+/turf/simulated/floor/wood/sif,
+/area/surface/wilderness/shack)
"BR" = (
/obj/structure/cliff/automatic{
dir = 8
@@ -220,6 +264,13 @@
/obj/effect/zone_divider,
/turf/simulated/mineral/sif,
/area/surface/outside/wilderness/mountains)
+"Ec" = (
+/obj/structure/table/sifwoodentable,
+/obj/item/material/knife,
+/obj/item/stack/cable_coil/white,
+/obj/item/material/fishing_rod/built,
+/turf/simulated/floor/outdoors/dirt/sif/planetuse,
+/area/surface/outside/wilderness/normal)
"Eo" = (
/obj/structure/cliff/automatic{
dir = 4
@@ -271,12 +322,11 @@
/turf/simulated/floor/wood/sif,
/area/surface/outside/path/wilderness)
"LN" = (
-/obj/effect/landmark/start{
- name = "Survivalist"
- },
/obj/effect/landmark/start{
name = "Trained Drake"
},
+/obj/structure/dogbed,
+/obj/item/reagent_containers/food/snacks/jerky/spider/poison,
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
"Mf" = (
@@ -312,9 +362,10 @@
/turf/simulated/floor/outdoors/grass/sif,
/area/surface/outside/path/wilderness)
"RA" = (
-/obj/structure/table/sifwoodentable,
-/obj/item/material/fishing_rod/built,
-/obj/item/stack/cable_coil/white,
+/obj/structure/closet/cabinet,
+/obj/item/reagent_containers/food/condiment/carton/flour/rustic,
+/obj/item/reagent_containers/food/condiment/carton/rice,
+/obj/item/reagent_containers/food/condiment/spacespice,
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
"Sa" = (
@@ -335,6 +386,15 @@
/obj/structure/bookcase,
/turf/simulated/floor/wood/sif,
/area/surface/wilderness/shack)
+"Tf" = (
+/obj/structure/closet/grave/dirthole{
+ name = "latrine pit"
+ },
+/turf/simulated/floor/outdoors/dirt/sif/planetuse,
+/area/surface/outside/wilderness/normal)
+"TH" = (
+/turf/simulated/wall/sifwood,
+/area/surface/outside/wilderness/normal)
"TP" = (
/obj/structure/railing{
dir = 8
@@ -360,6 +420,12 @@
/obj/effect/zone_divider,
/turf/simulated/floor/outdoors/mask,
/area/surface/outside/wilderness/mountains)
+"Xj" = (
+/obj/effect/landmark/start{
+ name = "Survivalist"
+ },
+/turf/simulated/floor/wood/sif,
+/area/surface/wilderness/shack)
"XN" = (
/obj/effect/zone_divider,
/turf/simulated/floor/outdoors/mask,
@@ -53767,12 +53833,12 @@ Ax
Ax
Ax
Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+ti
+ti
+ti
+ti
+ti
+ti
UA
jE
Ax
@@ -54016,19 +54082,19 @@ Ax
Ax
eZ
eZ
+JU
+JU
eZ
eZ
eZ
eZ
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+JU
+JU
+eZ
+eZ
+ti
+ti
+ti
Ax
Ax
UA
@@ -54273,18 +54339,18 @@ Ax
Ax
eZ
Tc
-bW
-LN
-bW
-eZ
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+uk
+uk
+Sc
+tC
+uk
+uk
+uk
+uk
+Sc
+tC
+ti
+ti
Ax
Ax
Ax
@@ -54527,21 +54593,21 @@ Ax
Ax
Ax
Ax
-Ax
+ti
eZ
RA
Sc
uk
-LN
-JU
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+uk
+eZ
+tC
+eZ
+eZ
+tC
+eZ
+eZ
+ti
+ti
Ax
Ax
Ax
@@ -54784,23 +54850,23 @@ Ax
Ax
Ax
Ax
-Ax
+ti
JU
sn
-uk
+zY
uk
LN
-JU
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+eZ
+Xj
+BH
+eZ
+Xj
+BH
+eZ
+ti
+TH
+eu
+TH
Ax
Ax
Ax
@@ -55040,24 +55106,24 @@ Ax
Ax
Ax
Ax
-Ax
-Ax
+ti
+ti
JU
fP
qr
uk
bW
eZ
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+AG
+ic
+eZ
+AG
+ic
+eZ
+ti
+TH
+Tf
+TH
Ax
Ax
Ax
@@ -55297,24 +55363,24 @@ Ax
Ax
Ax
Ax
-Ax
-Ax
+ti
+ti
eZ
eZ
eZ
tC
eZ
eZ
+eZ
+eZ
+eZ
+eZ
+eZ
+eZ
Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+TH
+TH
+TH
Ax
Ax
Ax
@@ -55555,17 +55621,17 @@ Ax
Ax
Ax
Ax
+ti
+Ec
+fQ
+zq
+ti
+ti
+ti
Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+ti
+ti
+ti
Ax
Ax
Ax
@@ -55813,11 +55879,11 @@ Ax
Ax
Ax
Ax
-Ax
-Ax
-Ax
-Ax
-Ax
+ti
+ti
+ti
+ti
+ti
Ax
Ax
Ax
@@ -56073,8 +56139,8 @@ Ax
Ax
Ax
Ax
-Ax
-Ax
+ti
+ti
Ax
Ax
Ax
@@ -56329,9 +56395,9 @@ Ax
Ax
Ax
Ax
+ti
Ax
-Ax
-Ax
+ti
Ax
Ax
Ax
diff --git a/maps/submaps/surface_submaps/mountains/IceCave1A.dmm b/maps/submaps/surface_submaps/mountains/IceCave1A.dmm
index 12a555c6ca..fda6ad4095 100644
--- a/maps/submaps/surface_submaps/mountains/IceCave1A.dmm
+++ b/maps/submaps/surface_submaps/mountains/IceCave1A.dmm
@@ -10,7 +10,7 @@
"j" = (/obj/random/outcrop,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
"r" = (/obj/random/medical/anom,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
"x" = (/obj/random/multiple/corp_crate,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
-"B" = (/obj/structure/bonfire/sifwood,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
+"B" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
"C" = (/obj/structure/loot_pile/surface/bones,/obj/item/clothing/suit/storage/hooded/wintercoat/science,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
"E" = (/obj/random/material/precious,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
"I" = (/obj/random/maintenance/anom,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/IceCave1A)
diff --git a/maps/submaps/surface_submaps/mountains/vault6.dmm b/maps/submaps/surface_submaps/mountains/vault6.dmm
index c1ae439301..e14e7ebe4d 100644
--- a/maps/submaps/surface_submaps/mountains/vault6.dmm
+++ b/maps/submaps/surface_submaps/mountains/vault6.dmm
@@ -10,7 +10,7 @@
"j" = (/turf/simulated/floor/cult,/area/submap/cave/vault6)
"k" = (/obj/random/tool/power,/obj/random/tech_supply,/turf/simulated/floor/cult,/area/submap/cave/vault6)
"l" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault6)
-"m" = (/obj/structure/bonfire/permanent/sifwood,/obj/structure/grille/rustic,/turf/simulated/floor/cult,/area/submap/cave/vault6)
+"m" = (/obj/structure/wood_fire/bonfire/sifwood,/obj/structure/grille/rustic,/turf/simulated/floor/cult,/area/submap/cave/vault6)
"n" = (/obj/random/multiple/minevault,/turf/simulated/floor/cult,/area/submap/cave/vault6)
"o" = (/obj/structure/cliff/automatic/corner,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault6)
"p" = (/obj/structure/cliff/automatic{icon_state = "cliffbuilder"; dir = 5},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/vault6)
diff --git a/maps/submaps/surface_submaps/plains/Peninsula.dmm b/maps/submaps/surface_submaps/plains/Peninsula.dmm
index 58fa992355..77917fffde 100644
--- a/maps/submaps/surface_submaps/plains/Peninsula.dmm
+++ b/maps/submaps/surface_submaps/plains/Peninsula.dmm
@@ -6,7 +6,7 @@
"f" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Peninsula)
"g" = (/obj/structure/table/woodentable,/obj/item/flashlight,/turf/template_noop,/area/submap/Peninsula)
"h" = (/obj/structure/table/woodentable,/obj/item/cell/device,/obj/item/cell/device,/obj/random/tech_supply/anom,/turf/template_noop,/area/submap/Peninsula)
-"i" = (/obj/structure/bonfire,/turf/template_noop,/area/submap/Peninsula)
+"i" = (/obj/structure/wood_fire/bonfire/fuelled,/turf/template_noop,/area/submap/Peninsula)
"j" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/template_noop)
(1,1,1) = {"
diff --git a/maps/submaps/surface_submaps/plains/bonfire.dmm b/maps/submaps/surface_submaps/plains/bonfire.dmm
index 32a8c07a3c..3cfb854c9e 100644
--- a/maps/submaps/surface_submaps/plains/bonfire.dmm
+++ b/maps/submaps/surface_submaps/plains/bonfire.dmm
@@ -4,7 +4,7 @@
"d" = (/obj/item/flame/lighter/random,/turf/template_noop,/area/submap/bonfire)
"e" = (/obj/item/reagent_containers/food/drinks/bottle/orangejuice,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
"f" = (/obj/item/stool/padded,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
-"g" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
+"g" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
"h" = (/obj/item/material/knife/machete,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
"i" = (/obj/item/clothing/head/helmet/material/makeshift,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
"j" = (/obj/item/stack/material/fuel/log/sif,/turf/simulated/floor/outdoors/dirt,/area/submap/bonfire)
diff --git a/maps/submaps/surface_submaps/plains/camp1.dmm b/maps/submaps/surface_submaps/plains/camp1.dmm
index 4f477464bd..0caa60574f 100644
--- a/maps/submaps/surface_submaps/plains/camp1.dmm
+++ b/maps/submaps/surface_submaps/plains/camp1.dmm
@@ -11,7 +11,7 @@
"k" = (/obj/structure/table/bench/wooden,/turf/simulated/floor/outdoors/dirt,/area/submap/camp1)
"l" = (/turf/simulated/floor/outdoors/dirt,/area/submap/camp1)
"m" = (/obj/item/material/knife/machete/hatchet,/turf/template_noop,/area/template_noop)
-"n" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/camp1)
+"n" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/camp1)
"o" = (/obj/item/flame/lighter,/turf/simulated/floor/outdoors/dirt,/area/submap/camp1)
(1,1,1) = {"
diff --git a/maps/submaps/surface_submaps/plains/hotspring.dmm b/maps/submaps/surface_submaps/plains/hotspring.dmm
index 9a79c62922..b68f9ef81b 100644
--- a/maps/submaps/surface_submaps/plains/hotspring.dmm
+++ b/maps/submaps/surface_submaps/plains/hotspring.dmm
@@ -1,5 +1,5 @@
"a" = (/turf/template_noop,/area/submap/hotspring)
-"c" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/hotspring)
+"c" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/hotspring)
"d" = (/obj/effect/vfx/steam,/turf/simulated/floor/water/shoreline/corner{dir = 4},/area/submap/hotspring)
"e" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/loot_pile/maint/trash,/turf/simulated/floor/outdoors/grass/sif,/area/submap/hotspring)
"f" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood/sif,/area/submap/hotspring)
diff --git a/maps/submaps/surface_submaps/plains/house1.dmm b/maps/submaps/surface_submaps/plains/house1.dmm
index 6280f10a48..b58fc3250f 100644
--- a/maps/submaps/surface_submaps/plains/house1.dmm
+++ b/maps/submaps/surface_submaps/plains/house1.dmm
@@ -8,7 +8,7 @@
"ah" = (/obj/structure/table/bench/wooden,/turf/simulated/floor/outdoors/dirt,/area/submap/house1)
"ai" = (/obj/structure/railing{dir = 8},/turf/simulated/floor/outdoors/grass/sif,/area/submap/house1)
"aj" = (/obj/structure/target_stake,/turf/simulated/floor/outdoors/dirt,/area/submap/house1)
-"ak" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/house1)
+"ak" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/submap/house1)
"al" = (/obj/item/target,/turf/simulated/floor/outdoors/grass/sif,/area/submap/house1)
"am" = (/obj/item/target/syndicate,/turf/simulated/floor/outdoors/grass/sif,/area/submap/house1)
"an" = (/turf/simulated/wall/wood,/area/submap/house1)
diff --git a/maps/submaps/surface_submaps/plains/house1_arealess.dmm b/maps/submaps/surface_submaps/plains/house1_arealess.dmm
index 72fa8bce8a..683a3cdf65 100644
--- a/maps/submaps/surface_submaps/plains/house1_arealess.dmm
+++ b/maps/submaps/surface_submaps/plains/house1_arealess.dmm
@@ -8,7 +8,7 @@
"ah" = (/obj/structure/table/bench/wooden,/turf/simulated/floor/outdoors/dirt,/area/template_noop)
"ai" = (/obj/structure/railing{dir = 8},/turf/simulated/floor/outdoors/grass/sif,/area/template_noop)
"aj" = (/obj/structure/target_stake,/turf/simulated/floor/outdoors/dirt,/area/template_noop)
-"ak" = (/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/template_noop)
+"ak" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/floor/outdoors/dirt,/area/template_noop)
"al" = (/obj/item/target,/turf/simulated/floor/outdoors/grass/sif,/area/template_noop)
"am" = (/obj/item/target/syndicate,/turf/simulated/floor/outdoors/grass/sif,/area/template_noop)
"an" = (/turf/simulated/wall/wood,/area/template_noop)
diff --git a/maps/submaps/surface_submaps/plains/oldhotel.dmm b/maps/submaps/surface_submaps/plains/oldhotel.dmm
index aba8229032..1a51af57f8 100644
--- a/maps/submaps/surface_submaps/plains/oldhotel.dmm
+++ b/maps/submaps/surface_submaps/plains/oldhotel.dmm
@@ -11,7 +11,7 @@
"dr" = (/obj/item/stack/material/fuel/log/sif,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/oldhotel)
"dz" = (/obj/structure/sink{dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/oldhotel)
"dL" = (/obj/structure/window/reinforced/full,/obj/structure/grille/rustic,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/oldhotel)
-"eK" = (/obj/structure/bonfire/sifwood,/obj/structure/grille/rustic,/turf/simulated/floor/outdoors/dirt,/area/submap/oldhotel)
+"eK" = (/obj/structure/wood_fire/bonfire/sifwood,/obj/structure/grille/rustic,/turf/simulated/floor/outdoors/dirt,/area/submap/oldhotel)
"go" = (/obj/structure/simple_door/iron,/turf/simulated/floor/wood,/area/submap/oldhotel)
"gA" = (/turf/template_noop,/area/template_noop)
"gM" = (/obj/machinery/appliance/cooker/oven,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/oldhotel)
diff --git a/maps/submaps/surface_submaps/plains/priderock.dmm b/maps/submaps/surface_submaps/plains/priderock.dmm
index f84dca6842..6b4dd284c2 100644
--- a/maps/submaps/surface_submaps/plains/priderock.dmm
+++ b/maps/submaps/surface_submaps/plains/priderock.dmm
@@ -1,6 +1,6 @@
"ae" = (/obj/structure/railing,/obj/item/bone,/turf/simulated/floor/outdoors/dirt,/area/submap/priderock)
"cR" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/outdoors/dirt,/area/submap/priderock)
-"dq" = (/obj/effect/decal/cleanable/dirt,/obj/structure/bonfire/sifwood,/turf/simulated/floor/outdoors/grass/sif,/area/submap/priderock)
+"dq" = (/obj/effect/decal/cleanable/dirt,/obj/structure/wood_fire/bonfire/sifwood,/turf/simulated/floor/outdoors/grass/sif,/area/submap/priderock)
"dD" = (/obj/random/junk,/turf/simulated/floor/outdoors/dirt,/area/submap/priderock)
"fL" = (/obj/structure/railing{dir = 8},/obj/structure/cliff/automatic{dir = 8},/turf/simulated/floor/outdoors/dirt,/area/submap/priderock)
"hI" = (/obj/structure/table/woodentable,/turf/simulated/floor/outdoors/grass/sif,/area/submap/priderock)
diff --git a/maps/submaps/surface_submaps/wilderness/GovPatrol.dmm b/maps/submaps/surface_submaps/wilderness/GovPatrol.dmm
index 72a75ef2ba..c9207698a7 100644
--- a/maps/submaps/surface_submaps/wilderness/GovPatrol.dmm
+++ b/maps/submaps/surface_submaps/wilderness/GovPatrol.dmm
@@ -9,7 +9,7 @@
"i" = (/obj/item/clothing/under/solgov/utility/sifguard,/obj/item/clothing/shoes/boots/jackboots,/obj/effect/decal/remains,/turf/template_noop,/area/submap/GovPatrol)
"j" = (/obj/item/stack/material/fuel/wood/sif,/turf/template_noop,/area/submap/GovPatrol)
"k" = (/obj/item/gun/projectile/shotgun/pump/rifle/lever,/turf/template_noop,/area/submap/GovPatrol)
-"l" = (/obj/structure/bonfire/sifwood,/turf/template_noop,/area/submap/GovPatrol)
+"l" = (/obj/structure/wood_fire/bonfire/sifwood,/turf/template_noop,/area/submap/GovPatrol)
"m" = (/obj/effect/decal/remains,/turf/template_noop,/area/submap/GovPatrol)
"u" = (/obj/random/projectile/scrapped_shotgun,/turf/template_noop,/area/submap/GovPatrol)
"I" = (/obj/item/clothing/head/beret/solgov/sifguard/patrol,/turf/template_noop,/area/submap/GovPatrol)
diff --git a/maps/submaps/surface_submaps/wilderness/Manor1.dmm b/maps/submaps/surface_submaps/wilderness/Manor1.dmm
index 8b267bbcd3..b443fbf7fe 100644
--- a/maps/submaps/surface_submaps/wilderness/Manor1.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Manor1.dmm
@@ -35,7 +35,7 @@
"aI" = (/obj/structure/flora/pottedplant/dead,/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aJ" = (/obj/effect/spider/stickyweb,/mob/living/simple_mob/animal/giant_spider/lurker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aK" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
-"aL" = (/obj/structure/fireplace,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
+"aL" = (/obj/structure/wood_fire/fireplace,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aM" = (/mob/living/simple_mob/animal/giant_spider/lurker,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aN" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
"aO" = (/obj/structure/bed,/obj/item/bedsheet,/turf/simulated/floor/holofloor/wood,/area/submap/Manor1)
diff --git a/maps/submaps/surface_submaps/wilderness/Shelter.dmm b/maps/submaps/surface_submaps/wilderness/Shelter.dmm
index e9270254a8..947ddd11d3 100644
--- a/maps/submaps/surface_submaps/wilderness/Shelter.dmm
+++ b/maps/submaps/surface_submaps/wilderness/Shelter.dmm
@@ -138,7 +138,7 @@
/turf/simulated/floor/outdoors/dirt,
/area/submap/Shelter1)
"yD" = (
-/obj/structure/fireplace,
+/obj/structure/wood_fire/fireplace,
/turf/simulated/floor/wood/sif,
/area/submap/Shelter1)
"zh" = (
diff --git a/maps/submaps/surface_submaps/wilderness/frostoasis.dmm b/maps/submaps/surface_submaps/wilderness/frostoasis.dmm
index 47017ce43a..9282708f55 100644
--- a/maps/submaps/surface_submaps/wilderness/frostoasis.dmm
+++ b/maps/submaps/surface_submaps/wilderness/frostoasis.dmm
@@ -6,7 +6,7 @@
"cm" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/outdoors/dirt,/area/submap/FrostOasis)
"co" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/FrostOasis)
"ct" = (/obj/structure/table/sifwoodentable,/obj/item/a_gift,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/submap/FrostOasis)
-"cA" = (/obj/structure/fireplace,/obj/effect/decal/cleanable/dirt,/obj/structure/sign/christmas/wreath,/turf/simulated/floor/wood,/area/submap/FrostOasis)
+"cA" = (/obj/structure/wood_fire/fireplace,/obj/effect/decal/cleanable/dirt,/obj/structure/sign/christmas/wreath,/turf/simulated/floor/wood,/area/submap/FrostOasis)
"do" = (/obj/effect/decal/cleanable/dirt,/obj/item/trash/driedfish,/turf/simulated/floor/wood,/area/submap/FrostOasis)
"dD" = (/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor/outdoors/dirt{outdoors = 0},/area/submap/FrostOasis)
"dF" = (/obj/structure/simple_door/sifwood,/turf/simulated/floor/wood,/area/submap/FrostOasis)
diff --git a/polaris.dme b/polaris.dme
index 0cf8774497..1e7df985a6 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1209,7 +1209,6 @@
#include "code\game\objects\structures\barricades.dm"
#include "code\game\objects\structures\barsign.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
-#include "code\game\objects\structures\bonfire.dm"
#include "code\game\objects\structures\catwalk.dm"
#include "code\game\objects\structures\cliff.dm"
#include "code\game\objects\structures\coathanger.dm"
@@ -1254,6 +1253,7 @@
#include "code\game\objects\structures\windoor_assembly.dm"
#include "code\game\objects\structures\window.dm"
#include "code\game\objects\structures\window_spawner.dm"
+#include "code\game\objects\structures\wood_fire.dm"
#include "code\game\objects\structures\crates_lockers\__closets.dm"
#include "code\game\objects\structures\crates_lockers\_closets_appearance_definitions.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"