diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index 6acf26a68d3..c24434866ee 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -1204,7 +1204,7 @@
"dg" = (
/obj/structure/stone_tile/center,
/obj/effect/mapping_helpers/no_lava,
-/obj/structure/bonfire,
+/obj/structure/lightable/bonfire,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"di" = (
diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm
index 1827a23d78f..2d2c1fd777d 100644
--- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm
+++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_shuttlecrash.dmm
@@ -197,7 +197,7 @@
/turf/simulated/floor/plating,
/area/ruin/unpowered/misc_lavaruin)
"sx" = (
-/obj/structure/bonfire,
+/obj/structure/lightable/bonfire,
/obj/effect/mapping_helpers/no_lava,
/turf/simulated/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm
index 6192c613ff9..204ece3d351 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm
@@ -9,7 +9,7 @@
/turf/simulated/floor/plating/asteroid/airless,
/area/ruin/space/unpowered/no_grav/way_home)
"d" = (
-/obj/structure/signpost{
+/obj/structure/signpost/ruin{
name = "salvation"
},
/turf/simulated/floor/plating/asteroid/airless,
diff --git a/_maps/map_files/shuttles/emergency_jungle.dmm b/_maps/map_files/shuttles/emergency_jungle.dmm
index 46009bb4ad7..c616056c708 100644
--- a/_maps/map_files/shuttles/emergency_jungle.dmm
+++ b/_maps/map_files/shuttles/emergency_jungle.dmm
@@ -163,7 +163,7 @@
},
/area/shuttle/escape)
"aL" = (
-/obj/structure/bonfire/lit/dense,
+/obj/structure/lightable/bonfire/lit/dense,
/turf/simulated/floor/grass,
/area/shuttle/escape)
"aN" = (
@@ -731,7 +731,7 @@
/turf/simulated/floor/grass,
/area/shuttle/escape)
"tc" = (
-/obj/structure/bonfire/lit/dense,
+/obj/structure/lightable/bonfire/lit/dense,
/turf/simulated/floor/mineral/plastitanium/red/brig{
icon_state = "wood"
},
diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm
index 4c20572b654..91db1c35a98 100644
--- a/_maps/map_files/stations/cerestation.dmm
+++ b/_maps/map_files/stations/cerestation.dmm
@@ -13264,7 +13264,7 @@
/turf/simulated/floor/carpet/grimey,
/area/station/security/detective)
"bPY" = (
-/obj/structure/bonfire,
+/obj/structure/lightable/bonfire,
/turf/simulated/floor/engine,
/area/station/service/library)
"bQc" = (
@@ -35390,11 +35390,6 @@
/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance,
/turf/simulated/floor/plating,
/area/station/hallway/primary/fore/north)
-"fXv" = (
-/obj/structure/disposalpipe/segment,
-/obj/effect/decal/cleanable/dirt,
-/turf/simulated/floor/plating,
-/area/station/maintenance/starboard)
"fXz" = (
/obj/effect/spawner/random/dirt/often,
/obj/structure/extinguisher_cabinet{
@@ -36404,7 +36399,7 @@
/turf/simulated/floor/transparent/glass/reinforced,
/area/station/maintenance/apmaint)
"gmR" = (
-/obj/structure/bonfire/lit,
+/obj/structure/lightable/bonfire/lit,
/obj/structure/stone_tile/surrounding/burnt,
/turf/simulated/floor/plating/asteroid/ancient,
/area/station/maintenance/fore2)
@@ -51216,6 +51211,11 @@
icon_state = "redcorner"
},
/area/station/hallway/primary/fore/west)
+"jKO" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/decal/cleanable/dirt,
+/turf/simulated/floor/plating,
+/area/station/maintenance/starboard)
"jKQ" = (
/obj/machinery/light/small{
dir = 4
@@ -171237,7 +171237,7 @@ lCC
hnV
tqi
tqi
-fXv
+jKO
eKJ
wyL
iJv
diff --git a/_maps/map_files/stations/emeraldstation.dmm b/_maps/map_files/stations/emeraldstation.dmm
index a0d419ab0e1..433b3538477 100644
--- a/_maps/map_files/stations/emeraldstation.dmm
+++ b/_maps/map_files/stations/emeraldstation.dmm
@@ -52375,7 +52375,7 @@
/turf/simulated/floor/plasteel,
/area/station/maintenance/dorms/fore)
"ksj" = (
-/obj/structure/bonfire,
+/obj/structure/lightable/bonfire,
/obj/item/food/fish_skewer{
pixel_y = 9;
pixel_x = 14
@@ -79593,7 +79593,7 @@
/turf/simulated/floor/plasteel,
/area/station/supply/sorting)
"pLi" = (
-/obj/structure/bonfire/lit,
+/obj/structure/lightable/bonfire/lit,
/obj/structure/stone_tile/slab/burnt,
/turf/simulated/floor/grass/jungle,
/area/station/maintenance/aft)
diff --git a/code/datums/components/shelved.dm b/code/datums/components/shelved.dm
index 3aa678d2efe..891d3716110 100644
--- a/code/datums/components/shelved.dm
+++ b/code/datums/components/shelved.dm
@@ -203,6 +203,15 @@
default_scale = 0.80
default_rotation = -90
+/datum/component/shelver/spear_rack
+ placement_zones = list(
+ list(1, 1, 13, 32) = list("x" = -6, "y" = 2, "layer" = BELOW_OBJ_LAYER),
+ list(14, 1, 20, 32) = list("x" = 0, "y" = 2, "layer" = BELOW_OBJ_LAYER),
+ list(21, 1, 32, 32) = list("x" = 6, "y" = 2, "layer" = BELOW_OBJ_LAYER),
+ )
+ default_scale = 0.80
+ default_rotation = -45
+
/// A component for items stored on shelves, propagated by [/datum/component/shelver] components.
/datum/component/shelved
/// The UID of the object acting as the shelf
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 167c761e8bc..6dbeb85387c 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -248,19 +248,25 @@ GLOBAL_LIST_INIT(wood_recipes, list(
new /datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 1 SECONDS),
new /datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/glass/bucket/wooden, 3, time = 1 SECONDS),
new /datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 10 SECONDS),
+ new /datum/stack_recipe("mug", /obj/item/reagent_containers/drinks/mug/wood, 1, time = 0.5 SECONDS),
new /datum/stack_recipe("notice board", /obj/item/mounted/noticeboard, 5, time = 5 SECONDS),
null,
new /datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20),
new /datum/stack_recipe_list("wood structures", list(
new /datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 1 SECONDS),
new /datum/stack_recipe("wooden chair", /obj/structure/chair/wood, 3, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("wooden stool", /obj/structure/chair/stool/wood, 2, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("dresser", /obj/structure/dresser, 30, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("wooden marker", /obj/structure/signpost/wood, 2, time = 2 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("spear rack", /obj/structure/spear_rack, 2, time = 2 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("slab bed", /obj/structure/bed/wood, 5, time = 1 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 2 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
- new /datum/stack_recipe("wooden airlock assembly", /obj/structure/door_assembly/door_assembly_wood, 4, time = 50, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("wooden airlock assembly", /obj/structure/door_assembly/door_assembly_wood, 4, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 1.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("torch sconce", /obj/structure/lightable/torch, 5, time = 3 SECONDS, one_per_turf = TRUE, on_floor = TRUE),
)),
new /datum/stack_recipe_list("pews", list(
new /datum/stack_recipe("pew (middle)", /obj/structure/chair/sofa/pew, 5, one_per_turf = TRUE, on_floor = TRUE),
diff --git a/code/game/objects/structures/misc_structures.dm b/code/game/objects/structures/misc_structures.dm
index a3d1f42cc9a..ae2ad164de0 100644
--- a/code/game/objects/structures/misc_structures.dm
+++ b/code/game/objects/structures/misc_structures.dm
@@ -6,13 +6,79 @@
*/
/obj/structure/signpost
+ name = "signpost"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "signpost"
anchored = TRUE
- density = TRUE
+ density = FALSE
+ new_attack_chain = TRUE
+ var/writing = ""
+
+/obj/structure/signpost/Initialize(mapload)
+ . = ..()
+ update()
+
+/obj/structure/signpost/deconstruct()
+ new /obj/item/stack/sheet/wood (get_turf(src), 2)
+ qdel(src)
+ ..()
+
+/obj/structure/signpost/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ deconstruct()
+
+/obj/structure/signpost/item_interaction(mob/living/user, obj/item/used, list/modifiers)
+ if(istype(used, /obj/item/pen))
+ rename(user)
+ return ITEM_INTERACT_COMPLETE
+ return ..()
+
+/obj/structure/signpost/proc/rename(mob/user)
+ var/n_name = rename_interactive(user)
+ if(n_name)
+ writing = n_name
+ update()
+ add_fingerprint(user)
+
+/obj/structure/signpost/proc/update()
+ if(writing)
+ overlays += "[initial(icon_state)]_writing"
+ desc = "It says: '[writing]'."
+ else
+ overlays.Cut()
+ desc = "It says... nothing."
+
+/obj/structure/signpost/ruin
+ name = "Salvation"
+ writing = "This way home"
+
+/obj/structure/signpost/wood
+ name = "wooden sign"
+ desc = "A small wooden marker."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "signpost_wood"
+ var/scarf = FALSE
+ max_integrity = 100
+
+/obj/structure/signpost/wood/AltClick(mob/living/user)
+ if(!scarf)
+ scarf = TRUE
+ to_chat(user, "You tie a memorial wreath around the sign.")
+ else
+ scarf = FALSE
+ to_chat(user, "You untie the memorial wreath from the sign.")
+ update()
+
+/obj/structure/signpost/wood/update()
+ ..()
+ if(scarf)
+ icon_state = "signpost_wood_scarf"
+ else
+ icon_state = "signpost_wood"
/obj/structure/ninjatele
-
name = "Long-Distance Teleportation Console"
desc = "A console used to send a Spider Clan operative long distances rapidly."
icon = 'icons/obj/ninjaobjects.dmi'
diff --git a/code/game/objects/structures/shelves.dm b/code/game/objects/structures/shelves.dm
index c0175375fe8..976d5e5e137 100644
--- a/code/game/objects/structures/shelves.dm
+++ b/code/game/objects/structures/shelves.dm
@@ -155,3 +155,44 @@ GLOBAL_LIST_INIT(shelf_colors, list("basic", "sci", "sup", "serv", "med", "sec",
name = "brass weapon rack"
icon_state = "gunrack_clockwork"
build_stack_type = /obj/item/stack/tile/brass
+
+/obj/structure/spear_rack
+ name = "spear rack"
+ desc = "A rack meant to hold spears, though you could probably balance other things on there if you tried..."
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "rack_wood"
+ layer = TABLE_LAYER
+ density = TRUE
+ anchored = TRUE
+ pass_flags_self = PASSTAKE
+ max_integrity = 80
+ var/build_stack_type = /obj/item/stack/sheet/wood
+ var/image/shelf_overlay
+
+/obj/structure/spear_rack/Initialize(mapload)
+ . = ..()
+ var/static/list/spear_subtypes = typesof(/obj/item/spear)
+ shelf_overlay = mutable_appearance('icons/obj/objects.dmi', "rack_wood_over")
+ shelf_overlay.layer = LOW_ITEM_LAYER
+ AddComponent(/datum/component/shelver/spear_rack, allowed_types_ = spear_subtypes)
+ update_appearance(UPDATE_OVERLAYS)
+
+ if(mapload)
+ SEND_SIGNAL(src, COMSIG_SHELF_ADDED_ON_MAPLOAD)
+
+/obj/structure/spear_rack/update_overlays()
+ return list(shelf_overlay)
+
+/obj/structure/spear_rack/wrench_act(mob/living/user, obj/item/I)
+ . = TRUE
+ if(user.a_intent != INTENT_HELP)
+ return FALSE
+ if(!I.use_tool(src, user, 2.5 SECONDS, volume = I.tool_volume))
+ return
+
+ to_chat(user, "You disassemble [src].")
+ deconstruct()
+
+/obj/structure/spear_rack/deconstruct(disassembled)
+ new build_stack_type(get_turf(src), 2)
+ return ..()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 28183daff66..2aa7c0db033 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -128,6 +128,13 @@
return TRUE
+/obj/structure/bed/wood
+ name = "wooden slab"
+ desc = "It looks even less comfortable than the floor it's built on..."
+ icon_state = "bed_wood"
+ buildstacktype = /obj/item/stack/sheet/wood
+ buildstackamount = 5
+
/*
* Roller beds
*/
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 e3a4db68a13..ae1b2ef290d 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -506,6 +506,16 @@
buildstackamount = 2
buildstacktype = /obj/item/stack/sheet/bamboo
+/obj/structure/chair/stool/wood
+ name = "wooden chair"
+ desc = "A short wooden stool. Pull up a stump, won't you?"
+ icon_state = "wooden_stool"
+ resistance_flags = FLAMMABLE
+ max_integrity = 50
+ buildstackamount = 2
+ buildstacktype = /obj/item/stack/sheet/wood
+ item_chair = /obj/item/chair/stool/wood
+
/obj/item/chair
name = "chair"
desc = "Bar brawl essential."
@@ -573,6 +583,13 @@
item_state = "stool_bamboo"
origin_type = /obj/structure/chair/stool/bamboo
+/obj/item/chair/stool/wood
+ name = "wood stool"
+ desc = "The barfighter's choice of stool."
+ icon_state = "wooden_stool_toppled"
+ item_state = "stool_wood"
+ origin_type = /obj/structure/chair/stool/wood
+
/obj/item/chair/AltClick(mob/user)
. = ..()
if(Adjacent(user))
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index d9a76bfacf8..2aaaef97190 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -909,6 +909,8 @@
anchored = TRUE
pass_flags_self = LETPASSTHROW | PASSTAKE
max_integrity = 20
+ var/deconstruction_item = /obj/item/rack_parts
+ var/deconstruction_quantity = 1
/obj/structure/rack/examine(mob/user)
. = ..()
@@ -1001,8 +1003,11 @@
/obj/structure/rack/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
density = FALSE
- var/obj/item/rack_parts/newparts = new(loc)
- transfer_fingerprints_to(newparts)
+ if(deconstruction_quantity)
+ new deconstruction_item(loc, deconstruction_quantity)
+ else
+ var/decon_parts = new deconstruction_item(get_turf(src))
+ transfer_fingerprints_to(decon_parts)
qdel(src)
/*
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index cfa2050e02c..16550bdb49c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -669,7 +669,7 @@
M.matchignite()
playsound(user.loc, 'sound/goonstation/misc/matchstick_light.ogg', 50, 1)
return
- if(M.lit && !M.burnt)
+ if(M.lit && !M.burnt && M.w_class <= WEIGHT_CLASS_SMALL)
user.visible_message("[user] crushes [M] into the bottom of [src], extinguishing it.","You crush [M] into the bottom of [src], extinguishing it.")
M.dropped()
return
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 14f5d5c6734..4a3a3f88998 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -842,7 +842,7 @@
name = "Bonfire"
time = 60
reqs = list(/obj/item/grown/log = 5)
- result = list(/obj/structure/bonfire)
+ result = list(/obj/structure/lightable/bonfire)
category = CAT_PRIMAL
alert_admins_on_craft = TRUE
diff --git a/code/modules/food_and_drinks/drinks/drinks/mugs.dm b/code/modules/food_and_drinks/drinks/drinks/mugs.dm
index f75698d5390..a921487a5eb 100644
--- a/code/modules/food_and_drinks/drinks/drinks/mugs.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/mugs.dm
@@ -170,3 +170,9 @@
desc = "An inscription on the side reads \"Best Captain 2559\"... The last time the station had a worthy captain."
icon_state = "mug_cap"
preset = TRUE
+
+/obj/item/reagent_containers/drinks/mug/wood
+ name = "wooden cup"
+ desc = "This is a tower-cap cup. All craftsdwarfship is... passable."
+ icon_state = "mug_wood"
+ preset = TRUE
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index 86b2a2133a8..b552bf735ac 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -119,9 +119,112 @@
name = "wooden spikes"
icon_state = "woodspike"
-/////////BONFIRES//////////
+//MARK: Bonfires and torches
-/obj/structure/bonfire
+/obj/structure/lightable
+ name = "lightable fire"
+ var/burning = FALSE
+ var/lighter // Who lit the fucking thing
+ var/fire_stack_strength = 5
+ var/dangerous = TRUE // Does this burn things that cross it?
+ var/heat_factor = 1000 // How much does this heat up the air?
+ var/light_strength = 6
+ light_color = "#ED9200"
+ density = FALSE
+ anchored = TRUE
+ new_attack_chain = TRUE
+
+/obj/structure/lightable/proc/CheckOxygen()
+ var/turf/T = get_turf(src)
+ var/datum/gas_mixture/G = T.get_readonly_air()
+ if(G.oxygen() > MIN_OXY_IGNITE)
+ return 1
+ return 0
+
+/obj/structure/lightable/Initialize(mapload)
+ . = ..()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_atom_entered),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
+/obj/structure/lightable/proc/on_atom_entered(datum/source, atom/movable/entered)
+ SIGNAL_HANDLER // COMSIG_ATOM_ENTERED
+
+ if(burning && dangerous)
+ Burn()
+ if(ishuman(entered))
+ var/mob/living/carbon/human/H = entered
+ add_attack_logs(src, H, "Burned by a bonfire (Lit by [lighter])", ATKLOG_ALMOSTALL)
+
+/obj/structure/lightable/proc/StartBurning(mob/user)
+ if(burning)
+ return
+ if(!CheckOxygen())
+ to_chat(user, "You can't seem to ignite [src] in this environment!")
+ return
+
+ icon_state = "[initial(icon_state)]_burning"
+ burning = TRUE
+ set_light(light_strength, l_color = light_color)
+ Burn()
+ START_PROCESSING(SSobj, src)
+
+/obj/structure/lightable/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
+ ..()
+ StartBurning()
+
+/obj/structure/lightable/proc/Burn()
+ var/turf/current_location = get_turf(src)
+ current_location.hotspot_expose(heat_factor, 10)
+ for(var/A in current_location)
+ if(A == src)
+ continue
+ if(isobj(A))
+ var/obj/O = A
+ if(dangerous)
+ O.fire_act(1000, 500)
+ else
+ O.temperature_expose(exposed_temperature = 400)
+ else if(isliving(A))
+ var/mob/living/L = A
+ if(dangerous)
+ L.adjust_fire_stacks(fire_stack_strength)
+ L.IgniteMob()
+ else
+ L.adjust_bodytemperature(10, 310)
+
+/obj/structure/lightable/process()
+ if(!CheckOxygen())
+ extinguish()
+ return
+ Burn()
+
+/obj/structure/lightable/extinguish()
+ if(burning)
+ icon_state = initial(icon_state)
+ burning = 0
+ set_light(0)
+ STOP_PROCESSING(SSobj, src)
+
+/obj/structure/lightable/item_interaction(mob/living/user, obj/item/used, list/modifiers)
+ . = ..()
+ if(istype(used, /obj/item/stack/rods) && !can_buckle)
+ var/obj/item/stack/rods/R = used
+ R.use(1)
+ can_buckle = TRUE
+ buckle_requires_restraints = TRUE
+ to_chat(user, "You add a rod to [src].")
+ var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16)
+ underlays += U
+ return ITEM_INTERACT_COMPLETE
+ if(used.get_heat())
+ lighter = user.ckey
+ user.create_log(MISC_LOG, "lit a bonfire", src)
+ StartBurning(user)
+ return ITEM_INTERACT_COMPLETE
+
+/obj/structure/lightable/bonfire
name = "bonfire"
desc = "For grilling, broiling, charring, smoking, heating, roasting, toasting, simmering, searing, melting, and occasionally burning things."
icon = 'icons/obj/hydroponics/equipment.dmi'
@@ -129,45 +232,21 @@
density = FALSE
anchored = TRUE
buckle_lying = FALSE
- var/burning = FALSE
- var/lighter // Who lit the fucking thing
- var/fire_stack_strength = 5
-/obj/structure/bonfire/Initialize(mapload)
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_atom_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/bonfire/dense
+/obj/structure/lightable/bonfire/dense
density = TRUE
/// haha empty define
-/obj/structure/bonfire/lit
+/obj/structure/lightable/bonfire/lit
-/obj/structure/bonfire/lit/dense
+/obj/structure/lightable/bonfire/lit/dense
density = TRUE
-/obj/structure/bonfire/lit/Initialize(mapload)
+/obj/structure/lightable/bonfire/lit/Initialize(mapload)
. = ..()
StartBurning()
-/obj/structure/bonfire/attackby__legacy__attackchain(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/stack/rods) && !can_buckle)
- var/obj/item/stack/rods/R = W
- R.use(1)
- can_buckle = TRUE
- buckle_requires_restraints = TRUE
- to_chat(user, "You add a rod to [src].")
- var/image/U = image(icon='icons/obj/hydroponics/equipment.dmi',icon_state="bonfire_rod",pixel_y=16)
- underlays += U
- if(W.get_heat())
- lighter = user.ckey
- user.create_log(MISC_LOG, "lit a bonfire", src)
- StartBurning(user)
-
-/obj/structure/bonfire/attack_hand(mob/user)
+/obj/structure/lightable/bonfire/attack_hand(mob/user)
if(burning)
to_chat(user, "You need to extinguish [src] before removing the logs!")
return
@@ -179,74 +258,34 @@
return
..()
-
-/// Check if we're standing in an oxygenless environment
-/obj/structure/bonfire/proc/CheckOxygen()
- var/turf/T = get_turf(src)
- var/datum/gas_mixture/G = T.get_readonly_air()
- if(G.oxygen() > MIN_OXY_IGNITE)
- return 1
- return 0
-
-/obj/structure/bonfire/proc/StartBurning(mob/user)
- if(burning)
- return
- if(!CheckOxygen())
- to_chat(user, "You can't seem to ignite [src] in this environment!")
- return
-
- icon_state = "bonfire_on_fire"
- burning = TRUE
- set_light(6, l_color = "#ED9200")
- Burn()
- START_PROCESSING(SSobj, src)
-
-/obj/structure/bonfire/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
- ..()
- StartBurning()
-
-/obj/structure/bonfire/proc/on_atom_entered(datum/source, atom/movable/entered)
- SIGNAL_HANDLER // COMSIG_ATOM_ENTERED
-
- if(burning)
- Burn()
- if(ishuman(entered))
- var/mob/living/carbon/human/H = entered
- add_attack_logs(src, H, "Burned by a bonfire (Lit by [lighter])", ATKLOG_ALMOSTALL)
-
-/obj/structure/bonfire/proc/Burn()
- var/turf/current_location = get_turf(src)
- current_location.hotspot_expose(1000, 10)
- for(var/A in current_location)
- if(A == src)
- continue
- if(isobj(A))
- var/obj/O = A
- O.fire_act(1000, 500)
- else if(isliving(A))
- var/mob/living/L = A
- L.adjust_fire_stacks(fire_stack_strength)
- L.IgniteMob()
-
-/obj/structure/bonfire/process()
- if(!CheckOxygen())
- extinguish()
- return
- Burn()
-
-/obj/structure/bonfire/extinguish()
- if(burning)
- icon_state = "bonfire"
- burning = 0
- set_light(0)
- STOP_PROCESSING(SSobj, src)
-
-/obj/structure/bonfire/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
+/obj/structure/lightable/bonfire/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(..())
M.pixel_y += 13
-/obj/structure/bonfire/unbuckle_mob(mob/living/buckled_mob, force = FALSE)
+/obj/structure/lightable/bonfire/unbuckle_mob(mob/living/buckled_mob, force = FALSE)
if(..())
buckled_mob.pixel_y -= 13
+/obj/structure/lightable/torch
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "torch"
+ name = "torch sconce"
+ desc = "A standing torch sconce, made from towercap wood."
+ dangerous = FALSE
+ light_strength = 4
+ light_color = "#f5df15"
+ max_integrity = 100
+
+/obj/structure/lightable/torch/wrench_act(mob/user, obj/item/I)
+ . = TRUE
+ if(!I.use_tool(src, user, 0, volume = I.tool_volume))
+ return
+ deconstruct()
+
+/obj/structure/lightable/torch/deconstruct()
+ density = FALSE
+ new /obj/item/stack/sheet/wood (get_turf(src), 5)
+ qdel(src)
+ ..()
+
#undef MIN_OXY_IGNITE
diff --git a/icons/mob/inhands/chairs_lefthand.dmi b/icons/mob/inhands/chairs_lefthand.dmi
index 9dec4b51bd4..2e6e9a2798e 100644
Binary files a/icons/mob/inhands/chairs_lefthand.dmi and b/icons/mob/inhands/chairs_lefthand.dmi differ
diff --git a/icons/mob/inhands/chairs_righthand.dmi b/icons/mob/inhands/chairs_righthand.dmi
index 3e143580991..01efedb00b7 100644
Binary files a/icons/mob/inhands/chairs_righthand.dmi and b/icons/mob/inhands/chairs_righthand.dmi differ
diff --git a/icons/obj/chairs.dmi b/icons/obj/chairs.dmi
index 8abc0e30135..c438eb27c85 100644
Binary files a/icons/obj/chairs.dmi and b/icons/obj/chairs.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index e7b27879af4..c86b6154912 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/mugs.dmi b/icons/obj/mugs.dmi
index 26517f45ed3..66a03e2f464 100644
Binary files a/icons/obj/mugs.dmi and b/icons/obj/mugs.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 2d8b464f907..5a3c7b1c9c5 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/stacks/organic.dmi b/icons/obj/stacks/organic.dmi
index 1ab5d7e9d22..745da24390c 100644
Binary files a/icons/obj/stacks/organic.dmi and b/icons/obj/stacks/organic.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 4495ee0ae12..9cbd5f4450e 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/tools/UpdatePaths/Scripts/28528_bonfire.txt b/tools/UpdatePaths/Scripts/28528_bonfire.txt
new file mode 100644
index 00000000000..94037a45f4d
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/28528_bonfire.txt
@@ -0,0 +1 @@
+/obj/structure/bonfire : /obj/structure/lightable/bonfire{@OLD}