diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
new file mode 100644
index 0000000000..f590af752b
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
@@ -0,0 +1,1721 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/template_noop,
+/area/template_noop)
+"ab" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface)
+"ac" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/ruin/unpowered/elephant_graveyard)
+"ad" = (
+/obj/effect/decal/cleanable/cobweb,
+/obj/structure/closet/crate/grave/lead_researcher,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/mob_spawn/human/skeleton,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ae" = (
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"af" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ag" = (
+/obj/effect/decal/cleanable/vomit,
+/obj/item/shovel,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ah" = (
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ai" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aj" = (
+/obj/effect/decal/cleanable/blood/tracks{
+ dir = 4
+ },
+/obj/item/paper/fluff/ruins/elephant_graveyard/final_message,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ak" = (
+/turf/open/floor/plating/asteroid/basalt/wasteland{
+ icon_state = "wasteland_dug"
+ },
+/area/ruin/unpowered/elephant_graveyard)
+"al" = (
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"am" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"an" = (
+/obj/item/reagent_containers/food/snacks/deadmouse,
+/obj/item/assembly/mousetrap,
+/turf/open/floor/plating/asteroid/basalt/wasteland{
+ icon_state = "wasteland_dug"
+ },
+/area/ruin/unpowered/elephant_graveyard)
+"ao" = (
+/obj/structure/statue/bone/skull/half,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ap" = (
+/obj/structure/statue/bone/skull/half{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aq" = (
+/obj/item/reagent_containers/glass/bottle/frostoil{
+ desc = "A small bottle. Contains cold sauce. There's a label on here: APPLY ON SEVERE BURNS.";
+ volume = 10
+ },
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ar" = (
+/obj/structure/flora/rock,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"as" = (
+/obj/structure/flora/rock,
+/obj/item/pickaxe{
+ layer = 2.5;
+ pixel_x = -8;
+ pixel_y = 5
+ },
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"at" = (
+/turf/closed/mineral/strong/wasteland,
+/area/lavaland/surface)
+"au" = (
+/obj/structure/table,
+/obj/item/t_scanner/adv_mining_scanner/lesser,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"av" = (
+/obj/structure/barricade/wooden/crude,
+/obj/structure/barricade/wooden,
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aw" = (
+/obj/structure/table,
+/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ax" = (
+/obj/structure/statue/bone/rib{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ay" = (
+/obj/structure/statue/bone/rib,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"az" = (
+/obj/structure/table,
+/obj/item/pen,
+/obj/item/pen,
+/obj/item/pen,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aA" = (
+/turf/closed/wall,
+/area/ruin/unpowered/elephant_graveyard)
+"aB" = (
+/obj/item/chair,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aC" = (
+/obj/effect/decal/remains/human,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aD" = (
+/obj/structure/table,
+/obj/item/reagent_containers/glass/bottle/plasma{
+ volume = 25
+ },
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aE" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aF" = (
+/obj/structure/table,
+/obj/machinery/power/floodlight,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aG" = (
+/obj/structure/table,
+/obj/effect/spawner/lootdrop/glowstick,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aH" = (
+/turf/closed/wall/mineral/titanium,
+/area/ruin/powered/graveyard_shuttle)
+"aI" = (
+/obj/effect/spawner/structure/window/shuttle,
+/obj/structure/grille,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/powered/graveyard_shuttle)
+"aJ" = (
+/obj/structure/table,
+/obj/item/clipboard,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aK" = (
+/obj/item/cigbutt,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aL" = (
+/obj/structure/table,
+/obj/item/paper_bin,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aM" = (
+/obj/structure/table,
+/obj/item/clothing/gloves/color/black,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aN" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/ruin/powered/graveyard_shuttle)
+"aO" = (
+/obj/effect/decal/cleanable/glass,
+/obj/machinery/computer,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"aP" = (
+/obj/structure/bed,
+/obj/item/flashlight/lantern,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aQ" = (
+/obj/machinery/power/floodlight,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aR" = (
+/obj/structure/table,
+/obj/item/taperecorder,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aS" = (
+/obj/structure/table,
+/obj/item/tape/random,
+/obj/item/tape/random,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aT" = (
+/obj/structure/closet/crate/bin,
+/obj/item/trash/candle,
+/obj/item/trash/can,
+/obj/item/trash/can,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/cigbutt,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aU" = (
+/obj/structure/bed,
+/obj/item/bedsheet/brown,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aV" = (
+/obj/structure/bed,
+/obj/item/bedsheet/brown,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aW" = (
+/obj/structure/filingcabinet/chestdrawer,
+/obj/item/clothing/mask/gas/explorer/folded,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"aX" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"aY" = (
+/obj/structure/sign/warning/nosmoking/circle,
+/turf/closed/wall,
+/area/ruin/unpowered/elephant_graveyard)
+"aZ" = (
+/obj/item/organ/brain,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ba" = (
+/obj/structure/headpike/bone,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bb" = (
+/obj/effect/decal/cleanable/oil/streak,
+/obj/effect/decal/cleanable/glass,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bc" = (
+/obj/structure/sign/poster/ripped,
+/turf/closed/wall,
+/area/ruin/unpowered/elephant_graveyard)
+"bd" = (
+/obj/item/organ/heart,
+/obj/item/organ/eyes,
+/obj/item/organ/ears,
+/obj/effect/decal/cleanable/blood/gibs/old,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"be" = (
+/obj/item/organ/lungs,
+/obj/item/organ/liver,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bf" = (
+/turf/closed/mineral/strong/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bg" = (
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall/mineral/titanium,
+/area/ruin/powered/graveyard_shuttle)
+"bh" = (
+/obj/effect/decal/cleanable/oil,
+/obj/structure/chair/office/light,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"bi" = (
+/obj/effect/turf_decal/delivery/white,
+/turf/open/floor/circuit/off,
+/area/ruin/powered/graveyard_shuttle)
+"bj" = (
+/obj/structure/barricade/wooden,
+/obj/structure/mineral_door/wood,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bk" = (
+/obj/item/kitchen/knife/combat/bone,
+/obj/item/organ/tongue,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bl" = (
+/obj/effect/decal/cleanable/shreds,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bm" = (
+/obj/structure/closet/wardrobe/curator,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bn" = (
+/obj/structure/sink/oil_well,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bo" = (
+/obj/item/stack/medical/gauze/improvised,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bp" = (
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"bq" = (
+/obj/machinery/iv_drip,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"br" = (
+/obj/structure/sign/warning/nosmoking/circle,
+/turf/closed/wall/mineral/titanium,
+/area/ruin/powered/graveyard_shuttle)
+"bs" = (
+/obj/structure/fence/door,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bt" = (
+/obj/structure/table,
+/turf/closed/mineral/strong/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bu" = (
+/obj/structure/bed,
+/obj/item/trash/pistachios,
+/obj/item/trash/chips,
+/obj/item/bedsheet/brown,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bv" = (
+/obj/effect/decal/remains/human,
+/obj/item/clothing/under/misc/overalls,
+/obj/item/clothing/mask/bandana/green,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bw" = (
+/obj/structure/rack,
+/obj/item/shovel,
+/obj/item/wrench,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bx" = (
+/obj/item/reagent_containers/food/snacks/deadmouse,
+/obj/item/assembly/mousetrap,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"by" = (
+/obj/structure/closet/emcloset,
+/obj/item/light/bulb,
+/obj/effect/turf_decal/box/white,
+/turf/open/floor/mineral/titanium/purple,
+/area/ruin/powered/graveyard_shuttle)
+"bz" = (
+/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny,
+/obj/item/cigbutt,
+/obj/item/cigbutt,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bA" = (
+/obj/machinery/suit_storage_unit/mining/eva,
+/obj/effect/turf_decal/box/white,
+/turf/open/floor/mineral/titanium/purple,
+/area/ruin/powered/graveyard_shuttle)
+"bB" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bC" = (
+/obj/structure/barricade/sandbags,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bD" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/elephant_graveyard)
+"bE" = (
+/obj/structure/shuttle/engine/heater,
+/obj/structure/window{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/cobweb/cobweb2,
+/turf/open/floor/mineral/titanium/purple,
+/area/ruin/powered/graveyard_shuttle)
+"bF" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/elephant_graveyard)
+"bG" = (
+/obj/effect/decal/remains/human,
+/obj/item/tank/internals/emergency_oxygen/empty,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bH" = (
+/obj/item/paper/fluff/ruins/elephant_graveyard,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface)
+"bI" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/powered/graveyard_shuttle)
+"bJ" = (
+/obj/structure/sign/warning/xeno_mining,
+/turf/closed/wall,
+/area/ruin/unpowered/elephant_graveyard)
+"bK" = (
+/obj/structure/sign/warning/explosives,
+/turf/closed/wall,
+/area/ruin/unpowered/elephant_graveyard)
+"bL" = (
+/obj/effect/decal/cleanable/blood/gibs/old,
+/obj/effect/decal/cleanable/blood/splatter,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bM" = (
+/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker,
+/obj/structure/closet/crate/grave,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bN" = (
+/obj/structure/sign/warning/securearea,
+/obj/structure/sign/warning/securearea,
+/turf/closed/mineral/strong/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bO" = (
+/obj/item/paper/fluff/ruins/elephant_graveyard,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bP" = (
+/obj/structure/barricade/wooden/crude,
+/obj/item/paper/fluff/ruins/elephant_graveyard,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/elephant_graveyard)
+"bQ" = (
+/obj/structure/filingcabinet/chestdrawer,
+/obj/effect/decal/cleanable/cobweb,
+/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"bR" = (
+/obj/effect/decal/cleanable/generic,
+/obj/item/cigbutt,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bS" = (
+/obj/effect/decal/cleanable/oil/slippery,
+/obj/machinery/rnd/destructive_analyzer,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"bT" = (
+/obj/structure/barricade/wooden,
+/obj/item/paper/fluff/ruins/elephant_graveyard,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bU" = (
+/obj/item/light/bulb/broken,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"bV" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/ruin/unpowered/elephant_graveyard)
+"bW" = (
+/obj/effect/decal/cleanable/glass,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/machinery/door/airlock/shuttle{
+ name = "archaeology shuttle airlock"
+ },
+/turf/open/floor/mineral/titanium/purple,
+/area/ruin/powered/graveyard_shuttle)
+"bX" = (
+/obj/effect/decal/remains/human,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/clothing/head/fedora/curator,
+/obj/item/clothing/suit/curator,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"bY" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/item/cigbutt,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"bZ" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface)
+"ca" = (
+/obj/structure/table,
+/obj/item/storage/firstaid/o2,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cb" = (
+/obj/machinery/power/port_gen/pacman,
+/obj/effect/mapping_helpers/network_builder/power_cable,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cc" = (
+/obj/effect/decal/remains/human,
+/obj/effect/decal/cleanable/blood/old,
+/obj/effect/decal/cleanable/shreds,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cd" = (
+/obj/item/trash/can,
+/obj/structure/bedsheetbin/empty,
+/obj/structure/table,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ce" = (
+/obj/structure/stone_tile/slab/cracked,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cf" = (
+/obj/structure/bed,
+/obj/item/wirecutters,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cg" = (
+/obj/structure/stone_tile/center/cracked,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ch" = (
+/obj/effect/decal/remains/human,
+/obj/item/restraints/handcuffs/cable/zipties/used,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ci" = (
+/obj/structure/stone_tile/surrounding_tile,
+/turf/open/floor/plating/asteroid/basalt/wasteland{
+ icon_state = "wasteland_dug"
+ },
+/area/ruin/unpowered/elephant_graveyard)
+"cj" = (
+/obj/structure/stone_tile/block/cracked,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ck" = (
+/obj/structure/reagent_dispensers/water_cooler,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cl" = (
+/obj/structure/closet/crate/grave,
+/obj/effect/mob_spawn/human/skeleton,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cm" = (
+/obj/structure/table/optable,
+/obj/item/storage/backpack/explorer,
+/obj/item/reagent_containers/food/drinks/soda_cans/cola,
+/obj/item/restraints/handcuffs/cable/zipties/used,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"cn" = (
+/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"co" = (
+/obj/effect/decal/cleanable/blood/drip,
+/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cq" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cr" = (
+/obj/structure/bonfire/prelit,
+/obj/effect/decal/cleanable/ash,
+/obj/item/organ/tail/lizard,
+/obj/effect/decal/cleanable/blood/old,
+/obj/structure/stone_tile/slab/cracked,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cs" = (
+/obj/structure/ore_box,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"ct" = (
+/obj/structure/stone_tile,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cu" = (
+/obj/structure/stone_tile{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cv" = (
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/mineral/titanium/white,
+/area/ruin/powered/graveyard_shuttle)
+"cw" = (
+/obj/structure/closet/crate/grave,
+/obj/effect/decal/cleanable/dirt/dust,
+/obj/effect/mob_spawn/human/skeleton,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+"cx" = (
+/obj/item/light/bulb/broken,
+/obj/effect/turf_decal/caution/stand_clear/white,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/mineral/titanium/purple,
+/area/ruin/powered/graveyard_shuttle)
+"cz" = (
+/obj/structure/stone_tile,
+/obj/effect/decal/cleanable/dirt/dust,
+/turf/open/floor/plating/asteroid/basalt/wasteland,
+/area/ruin/unpowered/elephant_graveyard)
+
+(1,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(2,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+at
+ab
+ab
+ab
+ac
+ac
+ac
+ac
+bf
+ac
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(3,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+bf
+bf
+bf
+bf
+bf
+ac
+ac
+ac
+ac
+bf
+bf
+bf
+ac
+ac
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(4,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+bf
+bf
+aT
+bR
+bf
+bf
+bf
+ac
+bf
+bf
+bf
+bf
+bf
+bf
+bf
+ac
+ac
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+"}
+(5,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+bf
+bf
+bf
+bz
+aK
+bY
+ae
+bf
+bf
+bf
+cs
+aE
+bJ
+bf
+bf
+bf
+ac
+ac
+ac
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+"}
+(6,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+bf
+bf
+bf
+bf
+aA
+bc
+aA
+aY
+ae
+bv
+ae
+cl
+ae
+ae
+aC
+bs
+bO
+ae
+ae
+ac
+ac
+ac
+ac
+ab
+ab
+ab
+aa
+aa
+aa
+"}
+(7,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+bf
+bf
+bf
+aq
+al
+al
+al
+aQ
+ae
+ae
+ak
+ae
+ae
+ae
+ae
+bK
+bf
+bf
+bf
+ae
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+aa
+aa
+"}
+(8,1,1) = {"
+aa
+aa
+ab
+ab
+ab
+bf
+bf
+al
+al
+ar
+ae
+ae
+ae
+ar
+aZ
+ae
+ba
+ae
+ba
+ae
+ae
+ae
+ae
+bf
+ae
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+aa
+"}
+(9,1,1) = {"
+aa
+ab
+ab
+bf
+bf
+bf
+al
+al
+ak
+ae
+aE
+ae
+ae
+ae
+ba
+ae
+af
+ae
+ae
+ae
+ba
+ae
+ak
+bf
+ae
+ae
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+aa
+"}
+(10,1,1) = {"
+ab
+ab
+bf
+bf
+bf
+al
+am
+ae
+ae
+ae
+ae
+cl
+ae
+ae
+ae
+co
+bd
+bk
+ae
+ae
+ae
+ae
+aE
+bf
+bf
+ae
+ae
+ac
+ac
+ac
+ac
+bG
+bM
+ac
+ac
+"}
+(11,1,1) = {"
+at
+bf
+bf
+bf
+bf
+al
+ae
+ae
+ao
+ae
+ax
+ax
+ax
+ax
+ae
+ae
+be
+cr
+ae
+cz
+ae
+ae
+bn
+cw
+bf
+bf
+bB
+ac
+ac
+ac
+ac
+bL
+ae
+ae
+ac
+"}
+(12,1,1) = {"
+at
+bf
+bf
+bf
+bf
+al
+cl
+ae
+ae
+ae
+ae
+ci
+cj
+ce
+ae
+cj
+ae
+cq
+ae
+ae
+cu
+ae
+ae
+ae
+bf
+bf
+bC
+ac
+ac
+ac
+ac
+ac
+ac
+bD
+ac
+"}
+(13,1,1) = {"
+bf
+ad
+ae
+bf
+cl
+al
+ae
+ae
+ae
+ae
+cg
+ae
+ak
+ak
+cn
+ae
+cq
+ae
+ct
+ar
+ae
+cl
+ae
+ae
+bf
+bf
+ae
+ac
+ac
+ac
+ac
+ac
+ac
+ae
+ac
+"}
+(14,1,1) = {"
+bf
+aj
+ae
+bf
+ae
+al
+aE
+ae
+ap
+ae
+ay
+ay
+ay
+ay
+ae
+ae
+ak
+ae
+ae
+bn
+ae
+ae
+aE
+aQ
+bf
+cl
+bB
+ae
+ac
+ac
+ac
+ac
+ac
+ae
+ac
+"}
+(15,1,1) = {"
+bf
+ai
+ag
+bf
+an
+al
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+ae
+cw
+ae
+ae
+ae
+ae
+ae
+al
+bf
+ac
+ae
+ae
+bB
+ac
+ac
+ac
+ac
+bD
+ac
+"}
+(16,1,1) = {"
+bf
+ai
+bf
+bf
+bf
+al
+al
+al
+ae
+ae
+aE
+ae
+ar
+ae
+ba
+ae
+ae
+ae
+ae
+ae
+ba
+ae
+ae
+al
+bf
+ac
+ac
+ae
+ae
+bB
+ac
+ac
+ac
+bB
+bP
+"}
+(17,1,1) = {"
+bf
+ae
+af
+bf
+bf
+aE
+bf
+al
+as
+au
+az
+aG
+aM
+aR
+ae
+ae
+ba
+ae
+ba
+ae
+ae
+aE
+cl
+al
+bf
+bf
+ac
+ac
+ae
+bD
+ac
+ac
+ac
+bF
+bT
+"}
+(18,1,1) = {"
+at
+bf
+ah
+bf
+bf
+af
+bf
+ae
+ae
+aw
+aB
+ae
+ae
+aS
+ae
+ae
+aE
+ae
+ae
+ae
+ae
+ae
+ae
+al
+cb
+bf
+ac
+ac
+ac
+ae
+bB
+bB
+bF
+bB
+bP
+"}
+(19,1,1) = {"
+ab
+bf
+af
+av
+af
+ae
+bf
+ae
+bt
+aD
+ch
+ae
+ae
+ca
+ae
+al
+al
+al
+al
+al
+al
+al
+al
+bx
+bf
+bf
+ac
+ac
+ac
+ac
+bF
+bB
+bV
+ac
+ac
+"}
+(20,1,1) = {"
+aa
+at
+bf
+bf
+bf
+bf
+bf
+bj
+bf
+aF
+aJ
+aL
+al
+al
+al
+bw
+bf
+ac
+bm
+ae
+bn
+bf
+bf
+bf
+bf
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+"}
+(21,1,1) = {"
+aa
+aa
+ab
+ac
+ac
+bf
+aU
+aE
+bf
+bf
+bf
+bf
+ck
+aX
+ae
+bf
+bf
+bf
+bf
+bf
+bf
+bf
+bf
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+"}
+(22,1,1) = {"
+aa
+aa
+ab
+ab
+ac
+bf
+aU
+ae
+bl
+cd
+bf
+bf
+bf
+bN
+ae
+bf
+bf
+bf
+bf
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ab
+ab
+ab
+ab
+ab
+ab
+bZ
+bZ
+"}
+(23,1,1) = {"
+aa
+aa
+aa
+ab
+ab
+bf
+aV
+bl
+aE
+bu
+bf
+bf
+bf
+bf
+bb
+bf
+bf
+bf
+bf
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+bZ
+bZ
+bZ
+bH
+bZ
+bZ
+bZ
+ab
+"}
+(24,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+at
+aP
+bo
+cc
+cf
+bf
+aH
+aH
+bg
+bW
+bg
+aH
+aH
+aH
+bH
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+ab
+ab
+ab
+"}
+(25,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+at
+bf
+bf
+bf
+bf
+aH
+aN
+bQ
+bh
+cv
+bU
+by
+aH
+aH
+bI
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+bZ
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(26,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+aI
+aO
+bX
+bi
+bp
+bi
+cx
+bE
+aH
+bI
+bZ
+bZ
+bZ
+bZ
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+"}
+(27,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+aH
+aN
+aW
+cm
+bq
+bS
+bA
+aH
+aH
+bI
+bZ
+bZ
+bZ
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+"}
+(28,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+aH
+aH
+aH
+br
+aH
+aH
+aH
+aH
+bZ
+bZ
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+"}
+(29,1,1) = {"
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+aa
+aa
+aa
+aa
+aa
+"}
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 29ab67271c..8d8b9f47ae 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -126,6 +126,13 @@
#define SCREWYHUD_DEAD 2
#define SCREWYHUD_HEALTHY 3
+//Threshold levels for beauty for humans
+#define BEAUTY_LEVEL_HORRID -66
+#define BEAUTY_LEVEL_BAD -33
+#define BEAUTY_LEVEL_DECENT 33
+#define BEAUTY_LEVEL_GOOD 66
+#define BEAUTY_LEVEL_GREAT 100
+
//Moods levels for humans
#define MOOD_LEVEL_HAPPY4 15
#define MOOD_LEVEL_HAPPY3 10
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 76507ba086..74470cf72e 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -182,6 +182,7 @@
#define TRAIT_PARA "paraplegic"
#define TRAIT_EMPATH "empath"
#define TRAIT_FRIENDLY "friendly"
+#define TRAIT_SNOB "snob"
#define TRAIT_CULT_EYES "cult_eyes"
#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item"
#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman.
diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm
index cc07f8e963..96d733e8da 100644
--- a/code/controllers/subsystem/materials.dm
+++ b/code/controllers/subsystem/materials.dm
@@ -11,7 +11,11 @@ SUBSYSTEM_DEF(materials)
///Dictionary of category || list of material refs
var/list/materials_by_category
///List of stackcrafting recipes for materials using rigid materials
- var/list/rigid_stack_recipes = list(new/datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE))
+ var/list/rigid_stack_recipes = list(
+ new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ new /datum/stack_recipe("sink", /obj/structure/sink/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE),
+ )
///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info)
/datum/controller/subsystem/materials/proc/InitializeMaterials()
diff --git a/code/datums/brain_damage/magic.dm b/code/datums/brain_damage/magic.dm
new file mode 100644
index 0000000000..249907a1b8
--- /dev/null
+++ b/code/datums/brain_damage/magic.dm
@@ -0,0 +1,60 @@
+//Magical traumas, caused by spells and curses.
+//Blurs the line between the victim's imagination and reality
+//Unlike regular traumas this can affect the victim's body and surroundings
+
+/datum/brain_trauma/magic
+ resilience = TRAUMA_RESILIENCE_LOBOTOMY
+
+/datum/brain_trauma/magic/stalker
+ name = "Stalking Phantom"
+ desc = "Patient is stalked by a phantom only they can see."
+ scan_desc = "extra-sensory paranoia"
+ gain_text = "You feel like something wants to kill you..."
+ lose_text = "You no longer feel eyes on your back."
+ var/obj/effect/hallucination/simple/stalker_phantom/stalker
+ var/close_stalker = FALSE //For heartbeat
+
+/datum/brain_trauma/magic/stalker/on_gain()
+ create_stalker()
+ ..()
+
+/datum/brain_trauma/magic/stalker/proc/create_stalker()
+ var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z) //random corner
+ stalker = new(stalker_source, owner)
+
+/datum/brain_trauma/magic/stalker/on_lose()
+ QDEL_NULL(stalker)
+ ..()
+
+/datum/brain_trauma/magic/stalker/on_life()
+ // Dead and unconscious people are not interesting to the psychic stalker.
+ if(owner.stat != CONSCIOUS)
+ return
+
+ // Not even nullspace will keep it at bay.
+ if(!stalker || !stalker.loc || stalker.z != owner.z)
+ qdel(stalker)
+ create_stalker()
+
+ if(get_dist(owner, stalker) <= 1)
+ playsound(owner, 'sound/magic/demon_attack1.ogg', 50)
+ owner.visible_message("[owner] is torn apart by invisible claws!", "Ghostly claws tear your body apart!")
+ owner.take_bodypart_damage(rand(20, 45))
+ else if(prob(50))
+ stalker.forceMove(get_step_towards(stalker, owner))
+ if(get_dist(owner, stalker) <= 8)
+ if(!close_stalker)
+ var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE)
+ owner.playsound_local(owner, slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT)
+ close_stalker = TRUE
+ else
+ if(close_stalker)
+ owner.stop_sound_channel(CHANNEL_HEARTBEAT)
+ close_stalker = FALSE
+ ..()
+
+/obj/effect/hallucination/simple/stalker_phantom
+ name = "???"
+ desc = "It's coming closer..."
+ image_icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ image_state = "curseblob"
diff --git a/code/datums/components/art.dm b/code/datums/components/art.dm
deleted file mode 100644
index f6d3cb6c61..0000000000
--- a/code/datums/components/art.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-
-#define BAD_ART 12.5
-#define GOOD_ART 25
-#define GREAT_ART 50
-
-/datum/component/art
- var/impressiveness = 0
-
-/datum/component/art/Initialize(impress)
- impressiveness = impress
- if(isobj(parent))
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_obj_examine)
- else
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_other_examine)
- if(isstructure(parent))
- RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
- if(isitem(parent))
- RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/apply_moodlet)
-
-/datum/component/art/proc/apply_moodlet(mob/M, impress)
- M.visible_message("[M] stops and looks intently at [parent].", \
- "You stop to take in [parent].")
- switch(impress)
- if (0 to BAD_ART)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
- if (BAD_ART to GOOD_ART)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
- if (GOOD_ART to GREAT_ART)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
- if(GREAT_ART to INFINITY)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
-
-
-/datum/component/art/proc/on_other_examine(datum/source, mob/M)
- apply_moodlet(M, impressiveness)
-
-/datum/component/art/proc/on_obj_examine(datum/source, mob/M)
- var/obj/O = parent
- apply_moodlet(M, impressiveness *(O.obj_integrity/O.max_integrity))
-
-/datum/component/art/proc/on_attack_hand(datum/source, mob/M)
- to_chat(M, "You start examining [parent]...")
- if(!do_after(M, 20, target = parent))
- return
- on_obj_examine(source, M)
-
-/datum/component/art/rev
-
-/datum/component/art/rev/apply_moodlet(mob/M, impress)
- M.visible_message("[M] stops to inspect [parent].", \
- "You take in [parent], inspecting the fine craftsmanship of the proletariat.")
-
- if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
- else
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm
index e06583ab61..caf200446f 100644
--- a/code/datums/components/crafting/guncrafting.dm
+++ b/code/datums/components/crafting/guncrafting.dm
@@ -12,6 +12,7 @@
/obj/item/weaponcrafting/stock
name = "rifle stock"
desc = "A classic rifle stock that doubles as a grip, roughly carved out of wood."
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 6)
icon_state = "riflestock"
/obj/item/weaponcrafting/durathread_string
diff --git a/code/datums/components/crafting/recipes/recipes_primal.dm b/code/datums/components/crafting/recipes/recipes_primal.dm
index ae611e5855..bb4f4ce6d5 100644
--- a/code/datums/components/crafting/recipes/recipes_primal.dm
+++ b/code/datums/components/crafting/recipes/recipes_primal.dm
@@ -116,4 +116,41 @@
always_availible = FALSE
reqs = list(/obj/item/stack/rods = 1,
/obj/item/stack/sheet/mineral/sandstone = 4)
- category = CAT_PRIMAL
\ No newline at end of file
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/rib
+ name = "Collosal Rib"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/stack/sheet/bone = 10,
+ /datum/reagent/oil = 5)
+ result = /obj/structure/statue/bone/rib
+ subcategory = CAT_PRIMAL
+
+/datum/crafting_recipe/skull
+ name = "Skull Carving"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/stack/sheet/bone = 6,
+ /datum/reagent/oil = 5)
+ result = /obj/structure/statue/bone/skull
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/halfskull
+ name = "Cracked Skull Carving"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/stack/sheet/bone = 3,
+ /datum/reagent/oil = 5)
+ result = /obj/structure/statue/bone/skull/half
+ category = CAT_PRIMAL
+
+/datum/crafting_recipe/boneshovel
+ name = "Serrated Bone Shovel"
+ always_availible = FALSE
+ reqs = list(
+ /obj/item/stack/sheet/bone = 4,
+ /datum/reagent/oil = 5,
+ /obj/item/shovel/spade = 1)
+ result = /obj/item/shovel/serrated
+ category = CAT_PRIMAL
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index 37d77a45bc..88ad75f345 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -321,6 +321,28 @@
if(0 to NUTRITION_LEVEL_STARVING)
add_event(null, "nutrition", /datum/mood_event/starving)
+/datum/component/mood/proc/update_beauty(area/A)
+ if(A.outdoors) //if we're outside, we don't care.
+ clear_event(null, "area_beauty")
+ return FALSE
+ if(HAS_TRAIT(parent, TRAIT_SNOB))
+ switch(A.beauty)
+ if(-INFINITY to BEAUTY_LEVEL_HORRID)
+ add_event(null, "area_beauty", /datum/mood_event/horridroom)
+ return
+ if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD)
+ add_event(null, "area_beauty", /datum/mood_event/badroom)
+ return
+ switch(A.beauty)
+ if(-INFINITY to BEAUTY_LEVEL_DECENT)
+ clear_event(null, "area_beauty")
+ if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD)
+ add_event(null, "area_beauty", /datum/mood_event/decentroom)
+ if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT)
+ add_event(null, "area_beauty", /datum/mood_event/goodroom)
+ if(BEAUTY_LEVEL_GREAT to INFINITY)
+ add_event(null, "area_beauty", /datum/mood_event/greatroom)
+
///Called when parent is revived.
/datum/component/mood/proc/on_revive(datum/source, full_heal)
START_PROCESSING(SSdcs, src)
diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm
new file mode 100644
index 0000000000..960d22af56
--- /dev/null
+++ b/code/datums/elements/art.dm
@@ -0,0 +1,64 @@
+
+#define BAD_ART 12.5
+#define GOOD_ART 25
+#define GREAT_ART 50
+
+/datum/element/art
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ var/impressiveness = 0
+
+/datum/element/art/Attach(datum/target, impress)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target))
+ return ELEMENT_INCOMPATIBLE
+ impressiveness = impress
+ if(isobj(target))
+ RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_obj_examine)
+ if(isstructure(target))
+ RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand)
+ if(isitem(target))
+ RegisterSignal(target, COMSIG_ITEM_ATTACK_SELF, .proc/apply_moodlet)
+ else
+ RegisterSignal(target, COMSIG_PARENT_EXAMINE, .proc/on_other_examine)
+
+/datum/element/art/Detach(datum/target)
+ UnregisterSignal(target, list(COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_HAND, COMSIG_ITEM_ATTACK_SELF))
+ return ..()
+
+/datum/element/art/proc/apply_moodlet(atom/source, mob/M, impress)
+ M.visible_message("[M] stops and looks intently at [source].", \
+ "You stop to take in [source].")
+ switch(impress)
+ if (0 to BAD_ART)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
+ if (BAD_ART to GOOD_ART)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
+ if (GOOD_ART to GREAT_ART)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
+ if(GREAT_ART to INFINITY)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
+
+/datum/element/art/proc/on_other_examine(atom/source, mob/M)
+ apply_moodlet(source, M, impressiveness)
+
+/datum/element/art/proc/on_obj_examine(atom/source, mob/M)
+ var/obj/O = source
+ apply_moodlet(source, M, impressiveness *(O.obj_integrity/O.max_integrity))
+
+/datum/element/art/proc/on_attack_hand(atom/source, mob/M)
+ to_chat(M, "You start examining [source]...")
+ if(!do_after(M, 20, target = source))
+ return
+ on_obj_examine(source, M)
+
+/datum/element/art/rev
+
+/datum/element/art/rev/apply_moodlet(atom/source, mob/M, impress)
+ M.visible_message("[M] stops to inspect [source].", \
+ "You take in [source], inspecting the fine craftsmanship of the proletariat.")
+
+ if(M.mind && M.mind.has_antag_datum(/datum/antagonist/rev))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
+ else
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
diff --git a/code/datums/elements/beauty.dm b/code/datums/elements/beauty.dm
new file mode 100644
index 0000000000..8acfda73e1
--- /dev/null
+++ b/code/datums/elements/beauty.dm
@@ -0,0 +1,34 @@
+/datum/element/beauty
+ element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH
+ id_arg_index = 2
+ var/beauty = 0
+
+/datum/element/beauty/Attach(datum/target, beautyamount)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target))
+ return ELEMENT_INCOMPATIBLE
+ beauty = beautyamount
+ RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area)
+ RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area)
+ var/area/A = get_area(target)
+ if(A)
+ enter_area(null, A)
+
+/datum/element/beauty/Detach(datum/target)
+ UnregisterSignal(target, list(COMSIG_ENTER_AREA, COMSIG_EXIT_AREA))
+ var/area/A = get_area(target)
+ if(A)
+ exit_area(null, A)
+ return ..()
+
+/datum/element/beauty/proc/enter_area(datum/source, area/A)
+ if(A.outdoors)
+ return
+ A.totalbeauty += beauty
+ A.update_beauty()
+
+/datum/element/beauty/proc/exit_area(datum/source, area/A)
+ if(A.outdoors)
+ return
+ A.totalbeauty -= beauty
+ A.update_beauty()
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index c658ac215d..1a8ce755e1 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -24,6 +24,8 @@ Simple datum which is instanced once per type and is used for every object of sa
var/value_per_unit = 0
///Armor modifiers, multiplies an items normal armor vars by these amounts.
var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1)
+ ///How beautiful is this material per unit?
+ var/beauty_modifier = 0
///This proc is called when the material is added to an object.
/datum/material/proc/on_applied(atom/source, amount, material_flags)
@@ -39,6 +41,9 @@ Simple datum which is instanced once per type and is used for every object of sa
if(istype(source, /obj)) //objs
on_applied_obj(source, amount, material_flags)
+ if(beauty_modifier)
+ addtimer(CALLBACK(source, /datum.proc/_AddElement, list(/datum/element/beauty, beauty_modifier * amount)), 0)
+
///This proc is called when the material is added to an object specifically.
/datum/material/proc/on_applied_obj(var/obj/o, amount, material_flags)
if(material_flags & MATERIAL_AFFECT_STATISTICS)
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index f189a91353..d4921a04d2 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -19,6 +19,7 @@
integrity_modifier = 0.1
sheet_type = /obj/item/stack/sheet/glass
value_per_unit = 0.0025
+ beauty_modifier = 0.05
armor_modifiers = list("melee" = 0.2, "bullet" = 0.2, "laser" = 0, "energy" = 1, "bomb" = 0, "bio" = 0.2, "rad" = 0.2, "fire" = 1, "acid" = 0.2) // yeah ok
/*
@@ -35,6 +36,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/silver
value_per_unit = 0.025
+ beauty_modifier = 0.075
///Slight force increase
/datum/material/gold
@@ -46,6 +48,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/gold
value_per_unit = 0.0625
+ beauty_modifier = 0.15
armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 1.15, "energy" = 1.15, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1.1)
///Has no special properties
@@ -58,6 +61,8 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/diamond
value_per_unit = 0.25
+ beauty_modifier = 0.3
+ armor_modifiers = list("melee" = 1.3, "bullet" = 1.3, "laser" = 0.6, "energy" = 1, "bomb" = 1.2, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1)
///Is slightly radioactive
/datum/material/uranium
@@ -68,6 +73,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/uranium
value_per_unit = 0.05
+ beauty_modifier = 0.3 //It shines so beautiful
armor_modifiers = list("melee" = 1.5, "bullet" = 1.4, "laser" = 0.5, "energy" = 0.5, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 1, "acid" = 1)
/datum/material/uranium/on_applied(atom/source, amount, material_flags)
@@ -88,6 +94,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/plasma
value_per_unit = 0.1
+ beauty_modifier = 0.15
armor_modifiers = list("melee" = 1.4, "bullet" = 0.7, "laser" = 0, "energy" = 1.2, "bomb" = 0, "bio" = 1.2, "rad" = 1, "fire" = 0, "acid" = 0.5)
/datum/material/plasma/on_applied(atom/source, amount, material_flags)
@@ -109,6 +116,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0)
alpha = 200
categories = list(MAT_CATEGORY_ORE = TRUE)
+ beauty_modifier = 0.5
sheet_type = /obj/item/stack/sheet/bluespace_crystal
value_per_unit = 0.15
@@ -121,6 +129,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/bananium
value_per_unit = 0.5
+ beauty_modifier = 0.5
armor_modifiers = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 10, "acid" = 0) //Clowns cant be blown away
/datum/material/bananium/on_applied(atom/source, amount, material_flags)
@@ -144,6 +153,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/titanium
value_per_unit = 0.0625
+ beauty_modifier = 0.05
armor_modifiers = list("melee" = 1.35, "bullet" = 1.3, "laser" = 1.3, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 0.7, "acid" = 1)
/datum/material/runite
@@ -154,6 +164,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
strength_modifier = 1.3
categories = list(MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/runite
+ beauty_modifier = 0.5
armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle.
///Force decrease
@@ -165,6 +176,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
strength_modifier = 0.85
sheet_type = /obj/item/stack/sheet/plastic
value_per_unit = 0.0125
+ beauty_modifier = -0.01
armor_modifiers = list("melee" = 1.5, "bullet" = 1.1, "laser" = 0.3, "energy" = 0.5, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1.1, "acid" = 1)
///Force decrease and mushy sound effect. (Not yet implemented)
@@ -176,6 +188,30 @@ Unless you know what you're doing, only use the first three numbers. They're in
strength_modifier = 0.8
value_per_unit = 0.025
+/datum/material/wood
+ name = "wood"
+ id = "wood"
+ desc = "Flexible, durable, but flamable. Hard to come across in space."
+ color = "#bb8e53"
+ strength_modifier = 0.5
+ sheet_type = /obj/item/stack/sheet/mineral/wood
+ categories = list(MAT_CATEGORY_RIGID = TRUE)
+ value_per_unit = 0.06
+ beauty_modifier = 0.1
+ armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 0.4, "energy" = 0.4, "bomb" = 1, "bio" = 0.2, "rad" = 0, "fire" = 0, "acid" = 0.3)
+
+/datum/material/wood/on_applied_obj(obj/source, amount, material_flags)
+ . = ..()
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/wooden = source
+ wooden.resistance_flags |= FLAMMABLE
+
+/datum/material/wood/on_removed_obj(obj/source, material_flags)
+ . = ..()
+ if(material_flags & MATERIAL_AFFECT_STATISTICS)
+ var/obj/wooden = source
+ wooden.resistance_flags &= ~FLAMMABLE
+
///Stronk force increase
/datum/material/adamantine
name = "adamantine"
@@ -186,6 +222,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/adamantine
value_per_unit = 0.25
+ beauty_modifier = 0.4
armor_modifiers = list("melee" = 1.5, "bullet" = 1.5, "laser" = 1.3, "energy" = 1.3, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 2.5, "acid" = 1)
///RPG Magic. (Admin only)
@@ -197,6 +234,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
categories = list(MAT_CATEGORY_RIGID = TRUE)
sheet_type = /obj/item/stack/sheet/mineral/mythril
value_per_unit = 0.75
+ beauty_modifier = 0.5
armor_modifiers = list("melee" = 2, "bullet" = 2, "laser" = 2, "energy" = 2, "bomb" = 2, "bio" = 2, "rad" = 2, "fire" = 2, "acid" = 2)
/datum/material/mythril/on_applied_obj(atom/source, amount, material_flags)
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index c56425b074..f5692c297a 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -153,7 +153,13 @@
mood_change = -4
timeout = 2400
+/datum/mood_event/graverobbing
+ description ="I just desecrated someone's grave... I can't believe I did that...\n"
+ mood_change = -8
+ timeout = 3 MINUTES
+
//These are unused so far but I want to remember them to use them later
+
/datum/mood_event/cloned_corpse
description = "I recently saw my own corpse...\n"
mood_change = -6
@@ -162,6 +168,8 @@
description = "HE'S CUTTING ME OPEN!!\n"
mood_change = -8
+//End unused
+
/datum/mood_event/sad_empath
description = "Someone seems upset...\n"
mood_change = -2
@@ -199,6 +207,8 @@
mood_change = -2
timeout = 1 MINUTES
+//Cursed stuff end.
+
/datum/mood_event/vampcandle
description = "Something is making your mind feel... loose...\n"
mood_change = -15
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 8f3811ca71..933eaf082e 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -250,4 +250,12 @@
cost = 5
placement_weight = 3
always_place = TRUE
- allow_duplicates = TRUE
+ allow_duplicates = TRUE
+
+/datum/map_template/ruin/lavaland/elephant_graveyard
+ name = "Elephant Graveyard"
+ id = "Graveyard"
+ description = "An abandoned graveyard, calling to those unable to continue."
+ suffix = "lavaland_surface_elephant_graveyard.dmm"
+ allow_duplicates = FALSE
+ cost = 10
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index d1b5240798..4b039aa1b5 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -10,6 +10,15 @@
lose_text = "You can taste again!"
medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents."
+/datum/quirk/snob
+ name = "Snob"
+ desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?"
+ value = 0
+ gain_text = "You feel like you understand what things should look like."
+ lose_text = "Well who cares about deco anyways?"
+ medical_record_text = "Patient seems to be rather stuck up."
+ mob_trait = TRAIT_SNOB
+
/datum/quirk/pineapple_liker
name = "Ananas Affinity"
desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 5fac1a4b65..dabbe93bec 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -38,6 +38,10 @@
var/poweralm = TRUE
var/lightswitch = TRUE
+ var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area.
+ var/beauty = 0 // Beauty average per open turf in the area
+ var/beauty_threshold = 150 //If a room is too big it doesn't have beauty.
+
var/requires_power = TRUE
/// This gets overridden to 1 for space in area/Initialize().
var/always_unpowered = FALSE
@@ -65,7 +69,7 @@
/// Hides area from player Teleport function.
var/hidden = FALSE
/// Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers
- var/safe = FALSE
+ var/safe = FALSE
/// If false, loading multiple maps with this area type will create multiple instances.
var/unique = TRUE
@@ -192,6 +196,7 @@ GLOBAL_LIST_EMPTY(teleportlocs)
/area/LateInitialize()
if(!base_area) //we don't want to run it twice.
power_change() // all machines set to current power level, also updates icon
+ update_beauty()
/area/proc/reg_in_areas_in_z()
if(contents.len)
@@ -538,6 +543,16 @@ GLOBAL_LIST_EMPTY(teleportlocs)
L.client.played = TRUE
addtimer(CALLBACK(L.client, /client/proc/ResetAmbiencePlayed), 600)
+///Divides total beauty in the room by roomsize to allow us to get an average beauty per tile.
+/area/proc/update_beauty()
+ if(!areasize)
+ beauty = 0
+ return FALSE
+ if(areasize >= beauty_threshold)
+ beauty = 0
+ return FALSE //Too big
+ beauty = totalbeauty / areasize
+
/area/Exited(atom/movable/M)
SEND_SIGNAL(src, COMSIG_AREA_EXITED, M)
SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area
diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm
index 76f090d5e3..19a1fd503d 100644
--- a/code/game/area/areas/ruins/lavaland.dm
+++ b/code/game/area/areas/ruins/lavaland.dm
@@ -32,6 +32,14 @@
/area/ruin/powered/seedvault
icon_state = "dk_yellow"
+/area/ruin/unpowered/elephant_graveyard
+ name = "Elephant Graveyard"
+ icon_state = "dk_yellow"
+
+/area/ruin/powered/graveyard_shuttle
+ name = "Elephant Graveyard"
+ icon_state = "green"
+
/area/ruin/unpowered/syndicate_lava_base
name = "Secret Base"
icon_state = "dk_yellow"
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 1ff27bafa9..21f3102891 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -313,10 +313,11 @@
. += desc
if(custom_materials)
+ var/list/materials_list = list()
for(var/i in custom_materials)
var/datum/material/M = i
- . += "It is made out of [M.name]."
-
+ materials_list += "[M.name]"
+ . += "It is made out of [english_list(materials_list)]."
if(reagents)
if(reagents.reagents_holder_flags & TRANSPARENT)
. += "It contains:"
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 3b32213509..4eeb6b8b0f 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -60,7 +60,8 @@
/datum/material/runite,
/datum/material/plastic,
/datum/material/adamantine,
- /datum/material/mythril
+ /datum/material/mythril,
+ /datum/material/wood
)
/// Base print speed
diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm
index 69aa3fb654..0954d12790 100644
--- a/code/game/objects/effects/contraband.dm
+++ b/code/game/objects/effects/contraband.dm
@@ -51,6 +51,7 @@
icon = 'icons/obj/contraband.dmi'
plane = ABOVE_WALL_PLANE
anchored = TRUE
+ buildable_sign = FALSE //Cannot be unwrenched from a wall.
var/ruined = FALSE
var/random_basetype
var/never_random = FALSE // used for the 'random' subclasses.
@@ -69,6 +70,8 @@
name = "poster - [name]"
desc = "A large piece of space-resistant printed paper. [desc]"
+ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 300)), 0)
+
/obj/structure/sign/poster/proc/randomise(base_type)
var/list/poster_types = subtypesof(base_type)
var/list/approved_types = list()
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 5720d5ce34..34996177af 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -5,6 +5,7 @@
var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA
var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints
var/mergeable_decal = TRUE //when two of these are on a same tile or do we need to merge them into just one?
+ var/beauty = 0
/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -26,6 +27,8 @@
if(LAZYLEN(diseases_to_add))
AddComponent(/datum/component/infective, diseases_to_add)
+ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, beauty)), 0)
+
/obj/effect/decal/cleanable/proc/replace_decal(obj/effect/decal/cleanable/C) // Returns true if we should give up in favor of the pre-existing decal
if(mergeable_decal)
qdel(C)
diff --git a/code/game/objects/effects/decals/cleanable/aliens.dm b/code/game/objects/effects/decals/cleanable/aliens.dm
index 3afc0ef671..fa4bfe7e67 100644
--- a/code/game/objects/effects/decals/cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/cleanable/aliens.dm
@@ -3,6 +3,7 @@
name = "xeno blood"
desc = "It's green and acidic. It looks like... blood?"
color = BLOOD_COLOR_XENO
+ beauty = -250
/obj/effect/decal/cleanable/blood/splatter/xeno
color = BLOOD_COLOR_XENO
diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm
index ab0d1caca4..a5acc7d394 100644
--- a/code/game/objects/effects/decals/cleanable/humans.dm
+++ b/code/game/objects/effects/decals/cleanable/humans.dm
@@ -7,6 +7,7 @@
blood_state = BLOOD_STATE_BLOOD
bloodiness = BLOOD_AMOUNT_PER_DECAL
color = BLOOD_COLOR_HUMAN //default so we don't have white splotches everywhere.
+ beauty = -100
/obj/effect/decal/cleanable/blood/replace_decal(obj/effect/decal/cleanable/blood/C)
if (C.blood_DNA)
@@ -45,12 +46,14 @@
icon_state = "tracks"
desc = "They look like tracks left by wheels."
random_icon_states = null
+ beauty = -50
/obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose
name = "blood"
icon_state = "ltrails_1"
desc = "Your instincts say you shouldn't be following these."
random_icon_states = null
+ beauty = -50
var/list/existing_dirs = list()
/obj/effect/decal/cleanable/trail_holder/update_icon()
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index e06c172519..2e45bbfca5 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -3,6 +3,7 @@
desc = "Someone should clean that up."
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
+ beauty = -50
/obj/effect/decal/cleanable/ash
name = "ashes"
@@ -10,6 +11,7 @@
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
mergeable_decal = FALSE
+ beauty = -50
/obj/effect/decal/cleanable/ash/Initialize()
. = ..()
@@ -24,6 +26,7 @@
/obj/effect/decal/cleanable/ash/large
name = "large pile of ashes"
icon_state = "big_ash"
+ beauty = -100
/obj/effect/decal/cleanable/ash/large/Initialize()
. = ..()
@@ -34,6 +37,7 @@
desc = "Back to sand."
icon = 'icons/obj/shards.dmi'
icon_state = "tiny"
+ beauty = -100
/obj/effect/decal/cleanable/glass/Initialize()
. = ..()
@@ -52,6 +56,7 @@
canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall)
smooth = SMOOTH_FALSE
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ beauty = -75
/obj/effect/decal/cleanable/dirt/Initialize()
. = ..()
@@ -72,6 +77,10 @@
desc = "It's still good. Four second rule!"
icon_state = "flour"
+/obj/effect/decal/cleanable/dirt/dust
+ name = "dust"
+ desc = "A thin layer of dust coating the floor."
+
/obj/effect/decal/cleanable/greenglow/ecto
name = "ectoplasmic puddle"
desc = "You know who to call."
@@ -80,8 +89,11 @@
/obj/effect/decal/cleanable/greenglow
name = "glowing goo"
desc = "Jeez. I hope that's not for lunch."
+ light_power = 1
+ light_range = 1
light_color = LIGHT_COLOR_GREEN
icon_state = "greenglow"
+ beauty = -300
/obj/effect/decal/cleanable/greenglow/Initialize(mapload)
. = ..()
@@ -97,6 +109,7 @@
layer = WALL_OBJ_LAYER
icon_state = "cobweb1"
resistance_flags = FLAMMABLE
+ beauty = -100
/obj/effect/decal/cleanable/cobweb/cobweb2
icon_state = "cobweb2"
@@ -108,10 +121,12 @@
icon = 'icons/effects/effects.dmi'
icon_state = "molten"
mergeable_decal = FALSE
+ beauty = -150
/obj/effect/decal/cleanable/molten_object/large
name = "big gooey grey mass"
icon_state = "big_molten"
+ beauty = -300
//Vomit (sorry)
/obj/effect/decal/cleanable/vomit
@@ -120,6 +135,7 @@
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
+ beauty = -150
/obj/effect/decal/cleanable/vomit/attack_hand(mob/user)
. = ..()
@@ -152,6 +168,7 @@
gender = NEUTER
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
+ beauty = -100
/obj/effect/decal/cleanable/plant_smudge
name = "plant smudge"
diff --git a/code/game/objects/effects/decals/cleanable/robots.dm b/code/game/objects/effects/decals/cleanable/robots.dm
index cf030df120..2765330977 100644
--- a/code/game/objects/effects/decals/cleanable/robots.dm
+++ b/code/game/objects/effects/decals/cleanable/robots.dm
@@ -10,6 +10,7 @@
blood_state = BLOOD_STATE_OIL
bloodiness = BLOOD_AMOUNT_PER_DECAL
mergeable_decal = FALSE
+ beauty = -50
/obj/effect/decal/cleanable/robot_debris/Initialize(mapload, list/datum/disease/diseases)
. = ..()
@@ -50,6 +51,7 @@
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
blood_state = BLOOD_STATE_OIL
bloodiness = BLOOD_AMOUNT_PER_DECAL
+ beauty = -100
/obj/effect/decal/cleanable/oil/Initialize()
. = ..()
@@ -58,6 +60,7 @@
/obj/effect/decal/cleanable/oil/streak
random_icon_states = list("streak1", "streak2", "streak3", "streak4", "streak5")
+ beauty = -50
/obj/effect/decal/cleanable/oil/slippery
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 168bca0b9a..77d9f09eff 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -104,10 +104,10 @@
desc = "An occult looking dagger that is cold to the touch. Somehow, the flawless orb on the pommel is made entirely of liquid blood."
icon = 'icons/obj/ice_moon/artifacts.dmi'
icon_state = "bloodletter"
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_NORMAL
/// Bleed stacks applied when an organic mob target is hit
var/bleed_stacks_per_hit = 3
-
+
/obj/item/kitchen/knife/bloodletter/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!isliving(target) || !proximity_flag)
@@ -198,6 +198,7 @@
throw_speed = 3
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.5)
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
custom_price = 200
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index 1459afeb2d..0843838d20 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -274,7 +274,7 @@ obj/item/shield/riot/bullet_proof
item_state = "buckler"
lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
- custom_materials = null
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 10)
resistance_flags = FLAMMABLE
repair_material = /obj/item/stack/sheet/mineral/wood
block_chance = 30
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 5f2b9fda41..f26f3587a4 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -279,11 +279,13 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
icon_state = "sheet-wood"
item_state = "sheet-wood"
icon = 'icons/obj/stack_objects.dmi'
+ custom_materials = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT)
sheettype = "wood"
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0)
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/mineral/wood
novariants = TRUE
+ material_type = /datum/material/wood
grind_results = list(/datum/reagent/carbon = 20)
/obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there.
diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm
index e81294ceea..817258d1c7 100644
--- a/code/game/objects/items/tanks/jetpack.dm
+++ b/code/game/objects/items/tanks/jetpack.dm
@@ -14,13 +14,15 @@
var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not
var/datum/effect_system/trail_follow/ion/ion_trail
-/obj/item/tank/jetpack/New()
+/obj/item/tank/jetpack/Initialize()
..()
+ ion_trail = new
+ ion_trail.set_up(src)
+
+/obj/item/tank/jetpack/populate_gas()
if(gas_type)
air_contents.gases[gas_type] = ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))
- ion_trail = new
- ion_trail.set_up(src)
/obj/item/tank/jetpack/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/toggle_jetpack))
@@ -188,8 +190,8 @@
var/obj/item/tank/internals/tank = null
var/mob/living/carbon/human/cur_user
-/obj/item/tank/jetpack/suit/New()
- ..()
+/obj/item/tank/jetpack/suit/Initialize()
+ . = ..()
STOP_PROCESSING(SSobj, src)
temp_air_contents = air_contents
diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm
index 0e6dfaa1b3..8f5303da8e 100644
--- a/code/game/objects/items/tanks/tank_types.dm
+++ b/code/game/objects/items/tanks/tank_types.dm
@@ -12,15 +12,13 @@
*/
/obj/item/tank/internals/oxygen
name = "oxygen tank"
- desc = "A tank of oxygen."
+ desc = "A tank of oxygen, this one is blue."
icon_state = "oxygen"
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
force = 10
dog_fashion = /datum/dog_fashion/back
-
-/obj/item/tank/internals/oxygen/New()
- ..()
+/obj/item/tank/internals/oxygen/populate_gas()
air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -35,6 +33,8 @@
icon_state = "oxygen_fr"
dog_fashion = null
+/obj/item/tank/internals/oxygen/empty/populate_gas()
+ return
/*
* Anesthetic
@@ -46,11 +46,9 @@
item_state = "an_tank"
force = 10
-/obj/item/tank/internals/anesthetic/New()
- ..()
+/obj/item/tank/internals/anesthetic/populate_gas()
air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrous_oxide] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
- return
/*
* Air
@@ -63,11 +61,9 @@
force = 10
dog_fashion = /datum/dog_fashion/back
-/obj/item/tank/internals/air/New()
- ..()
+/obj/item/tank/internals/air/populate_gas()
air_contents.gases[/datum/gas/oxygen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD
air_contents.gases[/datum/gas/nitrogen] = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD
- return
/*
@@ -82,10 +78,8 @@
force = 8
-/obj/item/tank/internals/plasma/New()
- ..()
+/obj/item/tank/internals/plasma/populate_gas()
air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
- return
/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/flamethrower))
@@ -100,10 +94,8 @@
else
return ..()
-/obj/item/tank/internals/plasma/full/New()
- ..() // Plasma asserted in parent
+/obj/item/tank/internals/plasma/full/populate_gas()
air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
- return
/*
@@ -118,13 +110,10 @@
force = 10
distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
-/obj/item/tank/internals/plasmaman/New()
- ..()
+/obj/item/tank/internals/plasmaman/populate_gas()
air_contents.gases[/datum/gas/plasma] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
- return
-/obj/item/tank/internals/plasmaman/full/New()
- ..() // Plasma asserted in parent
+/obj/item/tank/internals/plasmaman/full/populate_gas()
air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
@@ -137,12 +126,12 @@
volume = 6
w_class = WEIGHT_CLASS_SMALL //thanks i forgot this
-/obj/item/tank/internals/plasmaman/belt/full/New()
- ..() // Plasma asserted in parent
+/obj/item/tank/internals/plasmaman/belt/full/populate_gas()
air_contents.gases[/datum/gas/plasma] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
-
+/obj/item/tank/internals/plasmaman/belt/empty/populate_gas()
+ return
/*
* Emergency Oxygen
@@ -159,17 +148,25 @@
volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011)
-/obj/item/tank/internals/emergency_oxygen/New()
- ..()
+/obj/item/tank/internals/emergency_oxygen/populate_gas()
air_contents.gases[/datum/gas/oxygen] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
return
+/obj/item/tank/internals/emergency_oxygen/empty/populate_gas()
+ return
+
/obj/item/tank/internals/emergency_oxygen/engi
name = "extended-capacity emergency oxygen tank"
icon_state = "emergency_engi"
volume = 6
+/obj/item/tank/internals/emergency_oxygen/engi/empty/populate_gas()
+ return
+
/obj/item/tank/internals/emergency_oxygen/double
name = "double emergency oxygen tank"
icon_state = "emergency_double"
volume = 10
+
+/obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas()
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 1c92ed4e61..95712f386a 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -60,14 +60,19 @@
H.update_action_buttons_icon()
-/obj/item/tank/New()
- ..()
+/obj/item/tank/Initialize()
+ . = ..()
air_contents = new(volume) //liters
air_contents.temperature = T20C
+ populate_gas()
+
START_PROCESSING(SSobj, src)
+/obj/item/tank/proc/populate_gas()
+ return
+
/obj/item/tank/Destroy()
if(air_contents)
qdel(air_contents)
@@ -78,9 +83,9 @@
/obj/item/tank/examine(mob/user)
var/obj/icon = src
. = ..()
- if (istype(src.loc, /obj/item/assembly))
+ if(istype(src.loc, /obj/item/assembly))
icon = src.loc
- if(!in_range(src, user))
+ if(!in_range(src, user) && !isobserver(user))
if (icon == src)
. += "If you want any more information you'll need to get closer."
return
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index aa0aa70e03..1bb4579176 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -477,20 +477,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
throw_speed = 5
throw_range = 2
attack_verb = list("busted")
+ var/impressiveness = 45
-/obj/item/statuebust/attack_self(mob/living/user)
- add_fingerprint(user)
- user.examinate(src)
-
-/obj/item/statuebust/examine(mob/living/user)
+/obj/item/statuebust/Initialize()
. = ..()
- if(.)
- return
- if (!isliving(user))
- return
- user.visible_message("[user] stops to admire [src].", \
- "You take in [src], admiring its fine craftsmanship.")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
+ AddElement(/datum/element/art, impressiveness)
+ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 1000)), 0)
/obj/item/tailclub
name = "tail club"
@@ -566,6 +558,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
force = 10
throwforce = 12
attack_verb = list("beat", "smacked")
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 3.5)
w_class = WEIGHT_CLASS_BULKY
var/homerun_ready = 0
var/homerun_able = 0
diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
index 98f772a116..fcc26d1313 100644
--- a/code/game/objects/structures/artstuff.dm
+++ b/code/game/objects/structures/artstuff.dm
@@ -240,7 +240,7 @@
/obj/structure/sign/painting/Initialize(mapload, dir, building)
. = ..()
SSpersistence.painting_frames += src
- AddComponent(/datum/component/art, 20)
+ AddElement(/datum/element/art, 20)
if(dir)
setDir(dir)
if(building)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 57d7e08862..bd6dcb2aff 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -261,6 +261,11 @@ LINEN BINS
var/list/sheets = list()
var/obj/item/hidden = null
+/obj/structure/bedsheetbin/empty
+ amount = 0
+ icon_state = "linenbin-empty"
+ anchored = FALSE
+
/obj/structure/bedsheetbin/examine(mob/user)
. = ..()
if(amount < 1)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index e03ece2dfa..c1f8af43f0 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -303,6 +303,7 @@
/obj/item/twohanded/required/kirbyplants/Initialize()
. = ..()
AddElement(/datum/element/tactical)
+ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, 500)), 0)
/obj/item/twohanded/required/kirbyplants/random
icon = 'icons/obj/flora/_flora.dmi'
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index a1de5fe6a3..aa31fe9542 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -36,6 +36,7 @@
"You unfasten [src].")
var/obj/item/sign_backing/SB = new (get_turf(user))
SB.icon_state = icon_state
+ SB.set_custom_materials(custom_materials) //This is here so picture frames and wooden things don't get messed up.
SB.sign_path = type
SB.setDir(dir)
qdel(src)
diff --git a/code/game/objects/structures/signs/signs_plaques.dm b/code/game/objects/structures/signs/signs_plaques.dm
index 78c88cd09d..d1067f1963 100644
--- a/code/game/objects/structures/signs/signs_plaques.dm
+++ b/code/game/objects/structures/signs/signs_plaques.dm
@@ -46,3 +46,4 @@
name = "Mr. Deempisi portrait"
desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"
icon_state = "monkey_painting"
+ custom_materials = list(/datum/material/wood = 2000) //The same as /obj/structure/sign/picture_frame
diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm
index f735ed7bc9..3138d44e9d 100644
--- a/code/game/objects/structures/signs/signs_warning.dm
+++ b/code/game/objects/structures/signs/signs_warning.dm
@@ -73,3 +73,8 @@
name = "\improper ENGINEERING SAFETY"
desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift."
icon_state = "safety"
+
+/obj/structure/sign/warning/explosives
+ name = "\improper HIGH EXPLOSIVES sign"
+ desc = "A warning sign which reads 'HIGH EXPLOSIVES'."
+ icon_state = "explosives"
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 1f9491f4cf..466912f93e 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -11,6 +11,12 @@
var/impressiveness = 15
CanAtmosPass = ATMOS_PASS_DENSITY
+
+/obj/structure/statue/Initialize()
+ . = ..()
+ AddElement(/datum/element/art, impressiveness)
+ addtimer(CALLBACK(src, /datum.proc/_AddElement, list(/datum/element/beauty, impressiveness * 75)), 0)
+
/obj/structure/statue/attackby(obj/item/W, mob/living/user, params)
add_fingerprint(user)
if(!(flags_1 & NODECONSTRUCT_1))
@@ -29,29 +35,6 @@
return
return ..()
-/obj/structure/statue/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- user.changeNext_move(CLICK_CD_MELEE)
- add_fingerprint(user)
- if(!do_after(user, 20, target = src))
- return
- user.visible_message("[user] rubs some dust off [src].", \
- "You take in [src], rubbing some dust off its surface.")
- if(!ishuman(user)) // only humans have the capacity to appreciate art
- return
- var/totalimpressiveness = (impressiveness *(obj_integrity/max_integrity))
- switch(totalimpressiveness)
- if(GREAT_ART to 100)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat)
- if (GOOD_ART to GREAT_ART)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood)
- if (BAD_ART to GOOD_ART)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok)
- if (0 to BAD_ART)
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad)
-
/obj/structure/statue/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
if(material_drop_type)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index fbb1eac7d1..ddf7fa6bc6 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -11,6 +11,8 @@
var/cistern = 0 //if the cistern bit is open
var/w_items = 0 //the combined w_class of all the items in the cistern
var/mob/living/swirlie = null //the mob being given a swirlie
+ var/buildstacktype = /obj/item/stack/sheet/metal //they're metal now, shut up
+ var/buildstackamount = 1
/obj/structure/toilet/Initialize()
. = ..()
@@ -72,7 +74,18 @@
/obj/structure/toilet/update_icon_state()
icon_state = "toilet[open][cistern]"
+/obj/structure/toilet/deconstruct()
+ if(!(flags_1 & NODECONSTRUCT_1))
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
+ else
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(loc, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
+ ..()
+
/obj/structure/toilet/attackby(obj/item/I, mob/living/user, params)
+ add_fingerprint(user)
if(istype(I, /obj/item/crowbar))
to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...")
playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
@@ -80,7 +93,9 @@
user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.")
cistern = !cistern
update_icon()
-
+ else if(I.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1))
+ I.play_tool_sound(src)
+ deconstruct()
else if(cistern)
if(user.a_intent != INTENT_HARM)
if(I.w_class > WEIGHT_CLASS_NORMAL)
@@ -95,6 +110,10 @@
w_items += I.w_class
to_chat(user, "You carefully place [I] into the cistern.")
+ if(istype(I, /obj/item/reagent_containers/food/snacks/cube))
+ var/obj/item/reagent_containers/food/snacks/cube/cube = I
+ cube.Expand()
+ return
else if(istype(I, /obj/item/reagent_containers))
if (!open)
return
@@ -130,6 +149,11 @@
/obj/structure/toilet/secret/prison
secret_type = /obj/effect/spawner/lootdrop/prison_loot_toilet
+/obj/structure/toilet/greyscale
+
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ buildstacktype = null
+
/obj/structure/urinal
name = "urinal"
desc = "The HU-452, an experimental urinal. Comes complete with experimental urinal cake."
@@ -459,6 +483,8 @@
anchored = TRUE
var/busy = FALSE //Something's being washed at the moment
var/dispensedreagent = /datum/reagent/water // for whenever plumbing happens
+ var/buildstacktype = /obj/item/stack/sheet/metal
+ var/buildstackamount = 1
/obj/structure/sink/attack_hand(mob/living/user)
. = ..()
@@ -537,6 +563,11 @@
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
return
+ if(O.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1))
+ O.play_tool_sound(src)
+ deconstruct()
+ return
+
if(istype(O, /obj/item/stack/medical/gauze))
var/obj/item/stack/medical/gauze/G = O
new /obj/item/reagent_containers/rag(src.loc)
@@ -568,9 +599,18 @@
else
return ..()
-/obj/structure/sink/deconstruct(disassembled = TRUE)
- new /obj/item/stack/sheet/metal (loc, 3)
- qdel(src)
+/obj/structure/sink/deconstruct()
+ if(!(flags_1 & NODECONSTRUCT_1))
+ drop_materials()
+ ..()
+
+/obj/structure/sink/proc/drop_materials()
+ if(buildstacktype)
+ new buildstacktype(loc,buildstackamount)
+ else
+ for(var/i in custom_materials)
+ var/datum/material/M = i
+ new M.sheet_type(loc, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1))
/obj/structure/sink/kitchen
name = "kitchen sink"
@@ -655,6 +695,11 @@
icon_state = "puddle"
resistance_flags = UNACIDABLE
+/obj/structure/sink/greyscale
+ icon_state = "sink_greyscale"
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ buildstacktype = null
+
//ATTACK HAND IGNORING PARENT RETURN VALUE
/obj/structure/sink/puddle/attack_hand(mob/M)
icon_state = "puddle-splash"
@@ -669,6 +714,10 @@
/obj/structure/sink/puddle/deconstruct(disassembled = TRUE)
qdel(src)
+/obj/structure/sink/greyscale
+ material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
+ buildstacktype = null
+
//Shower Curtains//
//Defines used are pre-existing in layers.dm//
diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm
index c9b429cecc..06cd38a4c3 100644
--- a/code/game/turfs/simulated/floor/fancy_floor.dm
+++ b/code/game/turfs/simulated/floor/fancy_floor.dm
@@ -11,6 +11,7 @@
desc = "Stylish dark wood."
icon_state = "wood"
floor_tile = /obj/item/stack/tile/wood
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.25)
broken_states = list("wood-broken", "wood-broken2", "wood-broken3", "wood-broken4", "wood-broken5", "wood-broken6", "wood-broken7")
footstep = FOOTSTEP_WOOD
barefootstep = FOOTSTEP_WOOD_BAREFOOT
diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm
index 7d476d559e..048394b942 100644
--- a/code/game/turfs/simulated/minerals.dm
+++ b/code/game/turfs/simulated/minerals.dm
@@ -832,7 +832,7 @@
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
defer_change = TRUE
-
+
/turf/closed/mineral/gibtonite/ice
environment_type = "snow_cavern"
icon_state = "icerock_Gibtonite"
@@ -846,3 +846,55 @@
turf_type = /turf/open/floor/plating/asteroid/snow/ice/icemoon
baseturfs = /turf/open/floor/plating/asteroid/snow/ice/icemoon
initial_gas_mix = ICEMOON_DEFAULT_ATMOS
+
+/turf/closed/mineral/strong
+ name = "Very strong rock"
+ desc = "Seems to be stronger than the other rocks in the area. Only a master of mining techniques could destroy this."
+ environment_type = "basalt"
+ turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
+ baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ defer_change = 1
+ smooth_icon = 'icons/turf/walls/rock_wall.dmi'
+
+/*
+/turf/closed/mineral/strong/attackby(obj/item/I, mob/user, params)
+ if(!ishuman(user))
+ to_chat(usr, "Only a more advanced species could break a rock such as this one!")
+ return FALSE
+ var/mob/living/carbon/human/H = user
+ if(H.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_MASTER)
+ . = ..()
+ else
+ to_chat(usr, "The rock seems to be too strong to destroy. Maybe I can break it once I become a master miner.")
+*/
+
+/turf/closed/mineral/strong/gets_drilled(mob/user)
+ if(!ishuman(user))
+ return // see attackby
+ /*
+ var/mob/living/carbon/human/H = user
+ if(!(H.mind.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_MASTER))
+ return
+ */
+ drop_ores()
+// H.client.give_award(/datum/award/achievement/skill/legendary_miner, H)
+ var/flags = NONE
+ if(defer_change) // TODO: make the defer change var a var for any changeturf flag
+ flags = CHANGETURF_DEFER_CHANGE
+ ScrapeAway(flags=flags)
+ addtimer(CALLBACK(src, .proc/AfterChange), 1, TIMER_UNIQUE)
+ playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction
+// H.mind.adjust_experience(/datum/skill/mining, 100) //yay!
+
+/turf/closed/mineral/strong/proc/drop_ores()
+ if(prob(10))
+ new /obj/item/stack/sheet/mineral/mythril(src, 5)
+ else
+ new /obj/item/stack/sheet/mineral/adamantine(src, 5)
+
+/turf/closed/mineral/strong/acid_melt()
+ return
+
+/turf/closed/mineral/strong/ex_act(severity, target)
+ return
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 90b3d7d86b..2778c6abeb 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -198,6 +198,7 @@
desc = "A creepy wooden mask. Surprisingly expressive for a poorly carved bit of wood."
icon_state = "tiki_eyebrow"
item_state = "tiki_eyebrow"
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 1.25)
resistance_flags = FLAMMABLE
max_integrity = 100
actions_types = list(/datum/action/item_action/adjust)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 9c6c81372a..b197f4cf38 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -45,6 +45,7 @@
desc = "A pair of rather plain wooden sandals."
name = "sandals"
icon_state = "wizard"
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.5)
strip_delay = 50
equip_delay_other = 50
permeability_coefficient = 0.9
diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm
index ce76ad04fc..50a3dec9dd 100644
--- a/code/modules/mining/equipment/mining_tools.dm
+++ b/code/modules/mining/equipment/mining_tools.dm
@@ -168,3 +168,17 @@
throwforce = 7
custom_materials = list(/datum/material/iron=50)
w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/shovel/serrated
+ name = "serrated bone shovel"
+ desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs."
+ icon_state = "shovel_bone"
+ item_state = "shovel_bone"
+ lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi'
+ force = 15
+ throwforce = 12
+ w_class = WEIGHT_CLASS_NORMAL
+ toolspeed = 0.7
+ attack_verb = list("slashed", "impaled", "stabbed", "sliced")
+ sharpness = IS_SHARP
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index bbab74689c..ab0356aa66 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -270,6 +270,7 @@
desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "ntpod"
+ buildable_sign = FALSE
/obj/structure/sign/mining/survival
name = "shelter sign"
diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
index dfeff24141..bc5f198b4d 100644
--- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm
@@ -6,8 +6,8 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
name = "Dwarf"
id = "dwarf" //Also called Homo sapiens pumilionis
default_color = "FFFFFF"
- species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,NO_UNDERWEAR,TRAIT_DWARF)
- inherent_traits = list()
+ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS)
+ inherent_traits = list(TRAIT_DWARF,TRAIT_SNOB)
limbs_id = "human"
use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM
say_mod = "bellows" //high energy, EXTRA BIOLOGICAL FUEL
@@ -87,9 +87,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
var/heal_rate = 0.5 //The rate they heal damages over 400 alcohol stored. Default is 0.5 so we times 3 since 3 seconds.
var/alcohol_rate = 0.25 //The rate the alcohol ticks down per each iteration of dwarf_eth_ticker completing.
//These count in on_life ticks which should be 2 seconds per every increment of 1 in a perfect world.
- var/dwarf_filth_ticker = 0 //Currently set =< 4, that means this will fire the proc around every 4-8 seconds.
var/dwarf_eth_ticker = 0 //Currently set =< 1, that means this will fire the proc around every 2 seconds
- var/last_filth_spam
var/last_alcohol_spam
/obj/item/organ/dwarfgland/prepare_eat()
@@ -100,64 +98,10 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) //
/obj/item/organ/dwarfgland/on_life() //Primary loop to hook into to start delayed loops for other loops..
. = ..()
if(owner && owner.stat != DEAD)
- dwarf_cycle_ticker()
-
-//Handles the delayed tick cycle by just adding on increments per each on_life() tick
-/obj/item/organ/dwarfgland/proc/dwarf_cycle_ticker()
- dwarf_eth_ticker++
- dwarf_filth_ticker++
-
- if(dwarf_filth_ticker >= 4) //Should be around 4-8 seconds since a tick is around 2 seconds.
- dwarf_filth_cycle() //On_life will adjust regarding other factors, so we are along for the ride.
- dwarf_filth_ticker = 0 //We set the ticker back to 0 to go again.
- if(dwarf_eth_ticker >= 1) //Alcohol reagent check should be around 2 seconds, since a tick is around 2 seconds.
- dwarf_eth_cycle()
- dwarf_eth_ticker = 0
-
-//If this still friggin uses too much CPU, I'll make a for view subsystem If I have to.
-/obj/item/organ/dwarfgland/proc/dwarf_filth_cycle()
- if(!owner?.client || !owner?.mind)
- return
- //Filth Reactions - Since miasma now exists
- var/filth_counter = 0 //Holder for the filth check cycle, basically contains how much filth dwarf sees numerically.
- for(var/fuck in owner.fov_view(7)) //hello byond for view loop.
- if(istype(fuck, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = fuck
- if(H.stat == DEAD || (HAS_TRAIT(H, TRAIT_FAKEDEATH)))
- filth_counter += 10
- if(istype(fuck, /obj/effect/decal/cleanable/blood))
- if(istype(fuck, /obj/effect/decal/cleanable/blood/gibs))
- filth_counter += 1
- else
- filth_counter += 0.1
- if(istype(fuck,/obj/effect/decal/cleanable/vomit)) //They are disgusted by their own vomit too.
- filth_counter += 10 //Dwarves could technically chainstun each other in a vomit tantrum spiral.
- switch(filth_counter)
- if(11 to 25)
- if(last_filth_spam + 40 SECONDS < world.time)
- to_chat(owner, "Someone should really clean up in here!")
- last_filth_spam = world.time
- if(26 to 50)
- if(prob(6)) //And then the probability they vomit along with it.
- to_chat(owner, "The stench makes you queasy.")
- owner.vomit(10) //I think vomit should stay over a disgust adjustment.
- if(51 to 75)
- if(prob(9))
- to_chat(owner, "By Armok! You won't be able to keep alcohol down at all!")
- owner.vomit(20) //Its more funny
- if(76 to 100)
- if(prob(11))
- to_chat(owner, "You can't live in such FILTH!")
- owner.adjustToxLoss(10) //Now they start dying.
- owner.vomit(20)
- if(101 to INFINITY) //Now they will really start dying
- if(last_filth_spam + 12 SECONDS < world.time)
- to_chat(owner, " THERES TOO MUCH FILTH, OH GODS THE FILTH!")
- last_filth_spam = world.time
- if(prob(40))
- owner.adjustToxLoss(15)
- owner.vomit(30)
- CHECK_TICK //Check_tick right here, its motherfuckin magic. (To me at least)
+ dwarf_eth_ticker++
+ if(dwarf_eth_ticker >= 1) //Alcohol reagent check should be around 2 seconds, since a tick is around 2 seconds.
+ dwarf_eth_cycle()
+ dwarf_eth_ticker = 0
//Handles the dwarf alcohol cycle tied to on_life, it ticks in dwarf_cycle_ticker.
/obj/item/organ/dwarfgland/proc/dwarf_eth_cycle()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 35a2b3f058..aed3ff5848 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -384,3 +384,6 @@
/obj/item/paper/crumpled/bloody
icon_state = "scrap_bloodied"
+
+/obj/item/paper/crumpled/muddy
+ icon_state = "scrap_mud"
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 11ad81ebf0..9e6f827629 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -4,7 +4,7 @@
name = "picture frame"
desc = "The perfect showcase for your favorite deathtrap memories."
icon = 'icons/obj/decals.dmi'
- custom_materials = null
+ custom_materials = list(/datum/material/wood = 2000)
flags_1 = 0
icon_state = "frame-empty"
result_path = /obj/structure/sign/picture_frame
@@ -64,6 +64,7 @@
desc = "Every time you look it makes you laugh."
icon = 'icons/obj/decals.dmi'
icon_state = "frame-empty"
+ custom_materials = list(/datum/material/wood = 2000)
var/obj/item/photo/framed
var/persistence_id
var/can_decon = TRUE
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index b4e954f147..549f4eb48c 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -351,7 +351,7 @@
name = "wooden bucket"
desc = "It's a bucket made of wood."
icon_state = "bucket_wooden"
- custom_materials = null
+ custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 2)
slot_flags = NONE
item_flags = NO_MAT_REDEMPTION
diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
new file mode 100644
index 0000000000..65530031c0
--- /dev/null
+++ b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -0,0 +1,247 @@
+//******Decoration objects
+//***Bone statues and giant skeleton parts.
+/obj/structure/statue/bone
+ anchored = TRUE
+ max_integrity = 120
+ material_drop_type = /obj/item/stack/sheet/bone
+ impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least
+ layer = ABOVE_ALL_MOB_LAYER
+
+/obj/structure/statue/bone/rib
+ name = "collosal rib"
+ desc = "It's staggering to think that something this big could have lived, let alone died."
+ oreAmount = 4
+ icon = 'icons/obj/statuelarge.dmi'
+ icon_state = "rib"
+
+/obj/structure/statue/bone/skull
+ name = "collosal skull"
+ desc = "The gaping maw of a dead, titanic monster."
+ oreAmount = 12
+ icon = 'icons/obj/statuelarge.dmi'
+ icon_state = "skull"
+
+/obj/structure/statue/bone/skull/half
+ desc = "The gaping maw of a dead, titanic monster. This one is cracked in half."
+ oreAmount = 6
+ icon = 'icons/obj/statuelarge.dmi'
+ icon_state = "skull-half"
+
+//***Wasteland floor and rock turfs here.
+/turf/open/floor/plating/asteroid/basalt/wasteland //Like a more fun version of living in Arizona.
+ name = "cracked earth"
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "wasteland"
+ environment_type = "wasteland"
+ baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
+ digResult = /obj/item/stack/ore/glass/basalt
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ slowdown = 0.5
+ floor_variance = 30
+
+/turf/open/floor/plating/asteroid/basalt/wasteland/Initialize()
+ .=..()
+ if(prob(floor_variance))
+ icon_state = "[environment_type][rand(0,6)]"
+
+/turf/closed/mineral/strong/wasteland
+ name = "ancient dry rock"
+ color = "#B5651D"
+ environment_type = "wasteland"
+ turf_type = /turf/open/floor/plating/asteroid/basalt/wasteland
+ baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
+ smooth_icon = 'icons/turf/walls/rock_wall.dmi'
+
+/turf/closed/mineral/strong/wasteland/drop_ores()
+ if(prob(10))
+ new /obj/item/stack/ore/iron(src, 1)
+ new /obj/item/stack/ore/glass(src, 1)
+ new /obj/effect/decal/remains/human/grave(src, 1)
+ else
+ new /obj/item/stack/sheet/bone(src, 1)
+
+//***Oil well puddles.
+/obj/structure/sink/oil_well //You're not going to enjoy bathing in this...
+ name = "oil well"
+ desc = "A bubbling pool of oil.This would probably be valuable, had bluespace technology not destroyed the need for fossil fuels 200 years ago."
+ icon = 'icons/obj/watercloset.dmi'
+ icon_state = "puddle-oil"
+ dispensedreagent = /datum/reagent/oil
+
+/obj/structure/sink/oil_well/Initialize()
+ .=..()
+ create_reagents(20)
+ reagents.add_reagent(dispensedreagent, 20)
+
+/obj/structure/sink/oil_well/attack_hand(mob/M)
+ flick("puddle-oil-splash",src)
+ reagents.reaction(M, TOUCH, 20) //Covers target in 20u of oil.
+ to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.")
+
+/obj/structure/sink/oil_well/attackby(obj/item/O, mob/user, params)
+ flick("puddle-oil-splash",src)
+ if(O.tool_behaviour == TOOL_SHOVEL && !(flags_1&NODECONSTRUCT_1)) //attempt to deconstruct the puddle with a shovel
+ to_chat(user, "You fill in the oil well with soil.")
+ O.play_tool_sound(src)
+ deconstruct()
+ return 1
+ if(istype(O, /obj/item/reagent_containers)) //Refilling bottles with oil
+ var/obj/item/reagent_containers/RG = O
+ if(RG.is_refillable())
+ if(!RG.reagents.holder_full())
+ RG.reagents.add_reagent(dispensedreagent, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
+ to_chat(user, "You fill [RG] from [src].")
+ return TRUE
+ to_chat(user, "\The [RG] is full.")
+ return FALSE
+ if(user.a_intent != INTENT_HARM)
+ to_chat(user, "You won't have any luck getting \the [O] out if you drop it in the oil.")
+ return 1
+ else
+ return ..()
+
+/obj/structure/sink/oil_well/drop_materials()
+ new /obj/effect/decal/cleanable/oil(loc)
+
+//***Grave mounds.
+/obj/structure/closet/crate/grave
+ name = "burial mound"
+ desc = "An marked patch of soil, showing signs of a burial long ago. You wouldn't disturb a grave... right?"
+ icon = 'icons/obj/crates.dmi'
+ icon_state = "grave"
+ dense_when_open = TRUE
+ material_drop = /obj/item/stack/ore/glass/basalt
+ material_drop_amount = 5
+ anchorable = FALSE
+ anchored = TRUE
+ locked = TRUE
+ breakout_time = 900
+ cutting_tool = /obj/item/shovel
+ var/lead_tomb = FALSE
+ var/first_open = FALSE
+
+/obj/structure/closet/crate/grave/PopulateContents() //GRAVEROBBING IS NOW A FEATURE
+ ..()
+ new /obj/effect/decal/remains/human/grave(src)
+ switch(rand(1,8))
+ if(1)
+ new /obj/item/coin/gold(src)
+ new /obj/item/storage/wallet(src)
+ if(2)
+ new /obj/item/clothing/glasses/meson(src)
+ if(3)
+ new /obj/item/coin/silver(src)
+ new /obj/item/shovel/spade(src)
+ if(4)
+ new /obj/item/storage/book/bible/booze(src)
+ if(5)
+ new /obj/item/clothing/neck/stethoscope(src)
+ new /obj/item/scalpel(src)
+ new /obj/item/hemostat(src)
+
+ if(6)
+ new /obj/item/reagent_containers/glass/beaker(src)
+ new /obj/item/clothing/glasses/science(src)
+ if(7)
+ new /obj/item/clothing/glasses/sunglasses(src)
+ new /obj/item/clothing/mask/cigarette/rollie(src)
+
+/obj/structure/closet/crate/grave/open(mob/living/user, obj/item/S)
+ if(!opened)
+ to_chat(user, "The ground here is too hard to dig up with your bare hands. You'll need a shovel.")
+ else
+ to_chat(user, "The grave has already been dug up.")
+
+/obj/structure/closet/crate/grave/tool_interact(obj/item/S, mob/living/carbon/user)
+ if(user.a_intent == INTENT_HELP) //checks to attempt to dig the grave, must be done on help intent only.
+ if(!opened)
+ if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL)
+ to_chat(user, "You start start to dig open \the [src] with \the [S]...")
+ if (do_after(user,20, target = src))
+ opened = TRUE
+ locked = TRUE
+ dump_contents()
+ update_icon()
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing)
+ if(lead_tomb == TRUE && first_open == TRUE)
+ user.gain_trauma(/datum/brain_trauma/magic/stalker)
+ to_chat(user, "Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")
+ first_open = FALSE
+ return 1
+ return 1
+ else
+ to_chat(user, "You can't dig up a grave with \the [S.name].")
+ return 1
+ else
+ to_chat(user, "The grave has already been dug up.")
+ return 1
+
+ else if((user.a_intent != INTENT_HELP) && opened) //checks to attempt to remove the grave entirely.
+ if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL)
+ to_chat(user, "You start to remove \the [src] with \the [S].")
+ if (do_after(user,15, target = src))
+ to_chat(user, "You remove \the [src] completely.")
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing)
+ deconstruct(TRUE)
+ return 1
+ return
+
+/obj/structure/closet/crate/grave/bust_open()
+ ..()
+ opened = TRUE
+ update_icon()
+ dump_contents()
+ return
+
+/obj/structure/closet/crate/grave/lead_researcher
+ name = "ominous burial mound"
+ desc = "Even in a place filled to the brim with graves, this one shows a level of preperation and planning that fills you with dread."
+ icon = 'icons/obj/crates.dmi'
+ icon_state = "grave_lead"
+ lead_tomb = TRUE
+ first_open = TRUE
+
+/obj/structure/closet/crate/grave/lead_researcher/PopulateContents() //ADVANCED GRAVEROBBING
+ ..()
+ new /obj/effect/decal/cleanable/blood/gibs/old(src)
+ new /obj/item/book/granter/crafting_recipe/boneyard_notes(src)
+
+/obj/effect/decal/remains/human/grave
+ turf_loc_check = FALSE
+
+/obj/item/book/granter/crafting_recipe/boneyard_notes
+ name = "The Complete Works of Lavaland Bone Architecture"
+ desc = "Pried from the lead Archaeologist's cold, dead hands, this seems to explain how ancient bone architecture was erected long ago."
+ crafting_recipe_types = list(/datum/crafting_recipe/rib, /datum/crafting_recipe/boneshovel, /datum/crafting_recipe/halfskull, /datum/crafting_recipe/skull)
+ icon = 'icons/obj/library.dmi'
+ icon_state = "boneworking_learing"
+ oneuse = FALSE
+ remarks = list("Who knew you could bend bones that far back?", "I guess that was much easier before the planet heated up...", "So that's how they made those ruins survive the ashstorms. Neat!", "The page is just filled with insane ramblings about some 'legion' thing.", "But why would they need vinegar to polish the bones? And rags too?", "You spend a few moments cleaning dirt and blood off of the page, yeesh.")
+
+
+//***Fluff items for lore/intrigue
+/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard
+ name = "posted warning"
+ desc = "It seems to be smudged with mud and... oil?"
+ info = "TO WHOM IT MAY CONCERN
This area is property of the Nanotrasen Mining Division.
Trespassing in this area is illegal, highly dangerous, and subject to several NDAs.
Please turn back now, under intergalactic law section 48-R."
+
+/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes
+ name = "Research Findings: Day 26"
+ desc = "Huh, this one page looks like it was torn out of a full book. How odd."
+ icon_state = "docs_part"
+ info = "Researcher name: B--*--* J--*s.
Detailed findings:Today the camp site's cond-tion has wor--ene*. The ashst--ms keep blocking us off from le-ving the sit* for m-re supplies, and it's lo-king like we're out of pl*sma to p-wer the ge-erat*r. Can't rea-*y study c-*bon *ating with no li--ts, ya know? Da-*y's been going -*f again and ag-*n a-*ut h*w the company's left us to *ie here, but I j-s* keep tell-ng him to stop che*-in* out these damn graves. We m-y b* archaeologists, but -e sho*ld have t-e dec-**cy to know these grav-s are *-l NEW.
The rest of the page is just semantics about carbon dating methods."
+
+/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny
+ name = "hastily scribbled note"
+ desc = "Seems like someone was in a hurry."
+ info = "Alright, we all know that stuck up son a bitch is just doing this to keep us satisifed. Who the hell does he think he is, taking extra rations? We're OUT OF FOOD, CARL. Tomorrow at noon, we're going to try and take the ship by force. He HAS to be lying about the engine cooling down. He HAS TO BE. I'm tellin ya, with this implant I lifted off that last supply ship, I got the smarts to get us offa this shithole. Keep your knife handy carl."
+
+/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis
+ name = "research document"
+ desc = "Standard Nanotrasen typeface for important research documents."
+ info = "Day 9: Tenative Conclusions
While the area appears to be of significant cultural importance to the lizard race, outside of some sparce contact with native wildlife, we're yet to find any exact reasoning for the nature of this phenomenon. It seems that organic life is communally drawn to this planet as though it functions as a final resting place for intelligent life. As per company guidelines, this site shall be given the following classification: 'LZ-0271 - Elephant Graveyard'
Compiled list of Artifact findings (Currently Sent Offsite)
Cultist Blade Fragments: x8
Brass Multiplicative Ore Sample: x105
Syndicate Revolutionary Leader Implant (Broken) x1
Extinct Cortical Borer Tissue Sample x1
Space Carp Fossil x3"
+
+/obj/item/paper/fluff/ruins/elephant_graveyard/final_message
+ name = "important looking Note"
+ desc = "This note is well written, and seems to have been put here so you'd find it."
+ info = "If you find this... you don't need to know who I am.
You need to leave this place. I dunno what shit they did to me out here, but I don't think I'm going to be making it out of here.
This place... it wears down your psyche. The other researchers out here laughed it off but... They were the first to go.
One by one they started turning on each other. The more they found out, the more they started fighting and arguing...
As I speak now, I had to... I wound up having to put most of my men down. I know what I had to do, and I know there's no way left for me to live with myself.
If anyone ever finds this, just don't touch the graves.
DO NOT. TOUCH. THE GRAVES. Don't be a dumbass, like we all were."
diff --git a/config/lavaRuinBlacklist.txt b/config/lavaRuinBlacklist.txt
index 6d2d2633ce..e86cf42ea0 100644
--- a/config/lavaRuinBlacklist.txt
+++ b/config/lavaRuinBlacklist.txt
@@ -38,4 +38,5 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm
-#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm
\ No newline at end of file
+#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm
+#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm
\ No newline at end of file
diff --git a/icons/mob/inhands/equipment/mining_lefthand.dmi b/icons/mob/inhands/equipment/mining_lefthand.dmi
index e902690c37..7496aba625 100644
Binary files a/icons/mob/inhands/equipment/mining_lefthand.dmi and b/icons/mob/inhands/equipment/mining_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/mining_righthand.dmi b/icons/mob/inhands/equipment/mining_righthand.dmi
index dacf9be078..de3d11978a 100644
Binary files a/icons/mob/inhands/equipment/mining_righthand.dmi and b/icons/mob/inhands/equipment/mining_righthand.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 4f2238e391..95ae326f1e 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index 532324fcf4..a1bc443efb 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi
index f66767292c..c280ee786f 100644
Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ
diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi
index be12ab5f8b..727d69b1e3 100644
Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 20ffbdbe06..43bc9c48aa 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/statuelarge.dmi b/icons/obj/statuelarge.dmi
index e45afb8db8..e627a883cb 100644
Binary files a/icons/obj/statuelarge.dmi and b/icons/obj/statuelarge.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index 5670b9e839..4a299f29dd 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index d24efa0625..477120870b 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index f877aaf5b3..7386898655 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -381,6 +381,7 @@
#include "code\datums\brain_damage\brain_trauma.dm"
#include "code\datums\brain_damage\hypnosis.dm"
#include "code\datums\brain_damage\imaginary_friend.dm"
+#include "code\datums\brain_damage\magic.dm"
#include "code\datums\brain_damage\mild.dm"
#include "code\datums\brain_damage\phobia.dm"
#include "code\datums\brain_damage\severe.dm"
@@ -389,7 +390,6 @@
#include "code\datums\components\_component.dm"
#include "code\datums\components\anti_magic.dm"
#include "code\datums\components\armor_plate.dm"
-#include "code\datums\components\art.dm"
#include "code\datums\components\bane.dm"
#include "code\datums\components\bouncy.dm"
#include "code\datums\components\butchering.dm"
@@ -523,6 +523,8 @@
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\diseases\advance\symptoms\youth.dm"
#include "code\datums\elements\_element.dm"
+#include "code\datums\elements\art.dm"
+#include "code\datums\elements\beauty.dm"
#include "code\datums\elements\cleaning.dm"
#include "code\datums\elements\dusts_on_catatonia.dm"
#include "code\datums\elements\dusts_on_leaving_area.dm"
@@ -3093,6 +3095,7 @@
#include "code\modules\ruins\icemoonruin_code\library.dm"
#include "code\modules\ruins\lavalandruin_code\alien_nest.dm"
#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm"
+#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm"
#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm"
#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
#include "code\modules\ruins\lavalandruin_code\sloth.dm"