diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm
new file mode 100644
index 00000000..fb7c958f
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm
@@ -0,0 +1,748 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"b" = (
+/obj/structure/table/gmushroom/gmushroompoker{
+ desc = "You have a feeling this was used for more than dining.";
+ name = "dining table"
+ },
+/obj/item/trash/plate{
+ pixel_x = 10;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/food/snacks/grown/mushroom/plumphelmet{
+ pixel_x = 16;
+ pixel_y = 8
+ },
+/obj/structure/light_prism/spectral,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"c" = (
+/obj/structure/gmushroomdresser,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"d" = (
+/turf/closed/wall/mineral/gmushroom,
+/area/ruin/unpowered)
+"e" = (
+/obj/structure/lewdfountain/lust,
+/turf/open/floor/grass/fairy/red,
+/area/ruin/unpowered)
+"f" = (
+/obj/structure/chair/gmushroom{
+ dir = 8
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"g" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/effect/decal/cleanable/milk,
+/obj/structure/chair/gmushroom{
+ dir = 8
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"h" = (
+/obj/effect/decal/cleanable/semen,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"i" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"j" = (
+/obj/effect/decal/cleanable/semen,
+/obj/item/dildo/custom,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"k" = (
+/obj/item/grown/log/gmushroom,
+/turf/open/floor/grass/fairy/purple{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"l" = (
+/obj/machinery/door/airlock/cult/friendly,
+/obj/structure/fans/tiny/invisible,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"m" = (
+/obj/structure/chair/gmushroom{
+ dir = 4
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"o" = (
+/turf/open/floor/grass/fairy/green{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"p" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/structure/chair/gmushroom{
+ dir = 4
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"q" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/structure/bed/gmushroomdogbed,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"s" = (
+/obj/structure/light_prism/spectral,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"t" = (
+/obj/effect/decal/cleanable/semen,
+/obj/item/fleshlight,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"u" = (
+/obj/effect/mapping_helpers/no_lava,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"v" = (
+/obj/structure/flora/redgrass/redg,
+/turf/open/floor/grass/fairy/purple{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"w" = (
+/obj/effect/decal/cleanable/semen,
+/obj/structure/table/gmushroom/gmushroompoker{
+ desc = "You have a feeling this was used for more than dining.";
+ name = "dining table"
+ },
+/obj/item/trash/plate{
+ pixel_x = 10;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/food/snacks/pizzaslice/mushroom{
+ pixel_x = 9;
+ pixel_y = 4
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"x" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/structure/table/gmushroom/gmushroompoker{
+ desc = "You have a feeling this was used for more than dining.";
+ name = "dining table"
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"y" = (
+/obj/structure/flora/gmushroom/gggmushroom{
+ desc = "Mushroom! We're rich!"
+ },
+/obj/effect/mapping_helpers/no_lava,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"z" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/structure/chair/gmushroom{
+ dir = 8
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"A" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/item/portallight,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"B" = (
+/obj/structure/gmushroom/gmushroomstump,
+/turf/open/floor/grass/fairy/green{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"C" = (
+/obj/structure/reagent_dispensers/keg/aphro,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"D" = (
+/obj/structure/bonfire/prelit,
+/turf/open/floor/grass/fairy/purple{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"E" = (
+/obj/structure/table/gmushroom/gmushroompoker{
+ desc = "You have a feeling this was used for more than dining.";
+ name = "dining table"
+ },
+/obj/item/trash/plate{
+ pixel_x = -10;
+ pixel_y = 2
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"F" = (
+/obj/structure/reagent_dispensers/keg/aphro/strong,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"G" = (
+/obj/structure/table/gmushroom/gmushroompoker{
+ desc = "You have a feeling this was used for more than dining.";
+ name = "dining table"
+ },
+/obj/item/trash/plate{
+ pixel_x = -10;
+ pixel_y = 2
+ },
+/obj/item/reagent_containers/food/snacks/grown/mushroom/amanita{
+ pixel_x = -10;
+ pixel_y = 7
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"I" = (
+/obj/item/reagent_containers/food/snacks/grown/mushroom/jupitercup,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"J" = (
+/obj/structure/flora/gmushroom/gggmushroom{
+ desc = "Mushroom! We're rich!"
+ },
+/obj/effect/decal/remains/human{
+ desc = "He ate the popeyes biscuit with no drink...";
+ name = "Dusty Remains"
+ },
+/turf/open/floor/grass/fairy/blue{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"K" = (
+/obj/item/dildo/custom,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"L" = (
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"M" = (
+/obj/effect/decal/cleanable/femcum,
+/obj/item/portalpanties,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"N" = (
+/obj/effect/decal/cleanable/milk,
+/obj/structure/light_prism/spectral,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"O" = (
+/obj/effect/decal/cleanable/femcum,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"P" = (
+/obj/structure/flora/gmushroom/gggmushroom{
+ desc = "Mushroom! We're rich!"
+ },
+/turf/open/floor/grass/fairy/purple{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"Q" = (
+/obj/structure/flora/redgrass/redg,
+/turf/open/floor/grass/fairy/green{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"S" = (
+/obj/structure/flora/gmushroom/gggmushroom{
+ desc = "Mushroom! We're rich!"
+ },
+/turf/open/floor/grass/fairy/blue{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"T" = (
+/turf/open/floor/grass/fairy/blue{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"U" = (
+/obj/item/fleshlight,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"V" = (
+/turf/open/floor/grass/fairy/purple{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"W" = (
+/obj/item/grown/log/gmushroom,
+/turf/open/floor/grass/fairy/green{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"X" = (
+/obj/effect/decal/cleanable/semen,
+/obj/structure/chair/gmushroom{
+ dir = 4
+ },
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+"Y" = (
+/obj/structure/flora/gmushroom/gggmushroom{
+ desc = "Mushroom! We're rich!"
+ },
+/turf/open/floor/grass/fairy/green{
+ initial_gas_mix = "o2=14;n2=23;TEMP=300";
+ planetary_atmos = 1
+ },
+/area/lavaland/surface/outdoors)
+"Z" = (
+/obj/item/dildo/flared/gigantic,
+/turf/open/floor/gmushroom,
+/area/ruin/unpowered)
+
+(1,1,1) = {"
+i
+i
+i
+i
+u
+u
+T
+i
+i
+i
+u
+u
+u
+i
+i
+i
+u
+i
+i
+i
+"}
+(2,1,1) = {"
+i
+i
+i
+u
+S
+T
+V
+P
+V
+T
+P
+V
+u
+V
+i
+o
+Q
+u
+i
+i
+"}
+(3,1,1) = {"
+i
+S
+i
+V
+V
+o
+v
+T
+T
+V
+V
+T
+V
+V
+T
+Y
+o
+o
+S
+u
+"}
+(4,1,1) = {"
+i
+V
+T
+V
+V
+o
+o
+o
+T
+P
+V
+V
+V
+P
+V
+V
+o
+o
+V
+u
+"}
+(5,1,1) = {"
+u
+V
+T
+P
+V
+o
+P
+V
+V
+V
+V
+Q
+o
+o
+V
+o
+o
+Y
+V
+V
+"}
+(6,1,1) = {"
+V
+v
+T
+V
+o
+V
+V
+V
+Q
+o
+V
+Y
+o
+o
+P
+Q
+o
+T
+T
+v
+"}
+(7,1,1) = {"
+V
+S
+T
+o
+o
+Q
+o
+o
+V
+V
+o
+o
+o
+o
+V
+o
+o
+o
+V
+V
+"}
+(8,1,1) = {"
+i
+i
+i
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+V
+S
+"}
+(9,1,1) = {"
+i
+i
+d
+d
+d
+C
+N
+L
+L
+j
+L
+U
+L
+L
+N
+L
+q
+d
+V
+V
+"}
+(10,1,1) = {"
+i
+d
+d
+d
+F
+L
+K
+A
+m
+m
+X
+m
+p
+m
+L
+U
+Z
+d
+u
+V
+"}
+(11,1,1) = {"
+i
+d
+d
+e
+L
+h
+I
+K
+G
+x
+b
+E
+G
+w
+O
+L
+h
+l
+o
+u
+"}
+(12,1,1) = {"
+i
+d
+d
+d
+F
+L
+K
+M
+f
+f
+g
+f
+f
+z
+h
+U
+Z
+d
+o
+u
+"}
+(13,1,1) = {"
+i
+i
+d
+d
+d
+C
+s
+h
+L
+L
+t
+L
+j
+L
+s
+L
+c
+d
+o
+V
+"}
+(14,1,1) = {"
+i
+T
+o
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+d
+Y
+v
+"}
+(15,1,1) = {"
+T
+J
+T
+Q
+o
+o
+o
+o
+Y
+o
+o
+o
+o
+W
+o
+o
+o
+Q
+V
+V
+"}
+(16,1,1) = {"
+i
+V
+T
+T
+T
+o
+S
+V
+V
+V
+V
+B
+V
+D
+V
+V
+o
+o
+o
+u
+"}
+(17,1,1) = {"
+i
+o
+o
+P
+o
+T
+T
+v
+V
+T
+v
+T
+o
+k
+V
+V
+o
+P
+V
+u
+"}
+(18,1,1) = {"
+i
+V
+V
+u
+T
+V
+u
+V
+T
+T
+S
+V
+v
+V
+V
+u
+V
+V
+i
+S
+"}
+(19,1,1) = {"
+V
+P
+T
+T
+u
+S
+V
+u
+i
+T
+u
+i
+i
+u
+u
+u
+u
+i
+i
+i
+"}
+(20,1,1) = {"
+V
+u
+T
+u
+u
+T
+T
+u
+i
+i
+i
+i
+i
+i
+y
+i
+u
+i
+i
+i
+"}
diff --git a/_maps/map_files/LayeniaStation/LayeniaStation.dmm b/_maps/map_files/LayeniaStation/LayeniaStation.dmm
index 2d63af9b..9b9bd8b1 100644
--- a/_maps/map_files/LayeniaStation/LayeniaStation.dmm
+++ b/_maps/map_files/LayeniaStation/LayeniaStation.dmm
@@ -3319,7 +3319,7 @@
"jJq" = (/obj/machinery/door/poddoor/shutters/preopen{id = "robotics2"; name = "robotics lab shutters"},/obj/effect/spawner/structure/window,/obj/machinery/door/poddoor/shutters/preopen{id = "robotics2"; name = "robotics lab shutters"},/turf/open/floor/plating,/area/science/robotics/lab)
"jJs" = (/obj/item/reagent_containers/food/snacks/grown/poppy,/turf/open/floor/carpet,/area/chapel/main)
"jJv" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/button/door{id = "Disposal Exit 2"; name = "Disposal Exit Vent Control"; pixel_x = 25; pixel_y = -5; req_access_txt = "12"},/obj/machinery/button/massdriver{id = "Disposal Exit 1"; name = "Disposal Bay Vent Control"; pixel_x = 25; pixel_y = 4},/turf/open/floor/plasteel/dark,/area/maintenance/disposal)
-"jJF" = (/obj/structure/table/wood,/obj/item/nullrod,/turf/open/floor/plasteel/grimy,/area/chapel/office)
+"jJF" = (/obj/structure/table/wood,/obj/item/nullrod,/obj/item/book/granter/spell/smoke{name = "Mysterious Old Book of Cloud-Chasing"},/turf/open/floor/plasteel/grimy,/area/chapel/office)
"jKa" = (/obj/structure/closet/firecloset,/obj/effect/turf_decal/stripes/line{dir = 4},/turf/open/floor/plasteel/dark,/area/science/misc_lab)
"jKd" = (/obj/machinery/door/airlock/maintenance{name = "Law Office Maintenance"; req_access_txt = "38"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer1{name = "scrubbers pipe"},/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer3{name = "air supply pipe"},/turf/open/floor/plating,/area/lawoffice)
"jKu" = (/obj/structure/table,/obj/item/camera_film,/obj/item/camera,/obj/machinery/light{dir = 1; pixel_y = 16},/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer1{name = "air scrubber"},/turf/open/floor/plasteel,/area/crew_quarters/fitness)
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 06fc14fb..10aa54ee 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -731,3 +731,11 @@
//
///from datum/action/cyborg_small_sprite and sends when a cyborg changes modules
#define COMSIG_CYBORG_MODULE_CHANGE "cyborg_module_change"
+
+
+/* Attack signals. They should share the returned flags, to standardize the attack chain. */
+/// tool_act -> pre_attack -> target.attackby (item.attack) -> afterattack
+ ///Ends the attack chain. If sent early might cause posterior attacks not to happen.
+ #define COMPONENT_CANCEL_ATTACK_CHAIN (1<<0)
+ ///Skips the specific attack step, continuing for the next one to happen.
+ #define COMPONENT_SKIP_ATTACK (1<<1)
\ No newline at end of file
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index ec69fdb9..c12b4cdc 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -89,6 +89,12 @@
description = "When you get what they have, then you'll finally be happy."
suffix = "lavaland_surface_envy.dmm"
+/datum/map_template/ruin/lavaland/sin/lust
+ name = "Ruin of Lust"
+ id = "lust"
+ description = "Get your rocks off, even if it costs your soul."
+ suffix = "lavaland_surface_lust.dmm"
+
/datum/map_template/ruin/lavaland/sin/gluttony
name = "Ruin of Gluttony"
id = "gluttony"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index fef340e1..ac441556 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -11,7 +11,7 @@
new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/head/hardhat/weldhat/white(src)
- new /obj/item/clothing/gloves/color/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow/ce(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/tank/jetpack/suit(src)
new /obj/item/cartridge/ce(src)
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 80bee72c..653a72ac 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -10,6 +10,20 @@
var/can_be_cut = 1
price = 10
+/obj/item/clothing/gloves/color/yellow/ce //funky looking, basically combat gloves
+ desc = "Special Insulated gloves with pricy thermal shielding normally only found in combat gloves."
+ name = "Chief Engineer Insulated Gloves"
+ icon_state = "ce_insuls"
+ item_state = "combat"
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
+ strip_delay = 80
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ resistance_flags = NONE
+
/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
name = "budget insulated gloves"
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 96c9f9ff..d2423a3f 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -406,6 +406,36 @@ Contains:
icon_state = "hardsuit0-beserker"
item_state = "hardsuit0-beserker"
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/miner
+ name = "inquisitor's hardsuit"
+ icon_state = "hardsuit-inq"
+ item_state = "hardsuit-inq"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/miner
+ armor = list("melee" = 70, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
+ slowdown = 1
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/miner
+ name = "inquisitor's helmet"
+ icon_state = "hardsuit0-inq"
+ item_state = "hardsuit0-inq"
+ armor = list("melee" = 70, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
+
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/miner
+ name = "champion's hardsuit"
+ desc = "Voices echo from the hardsuit, driving the user insane."
+ icon_state = "hardsuit-beserker"
+ item_state = "hardsuit-beserker"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/miner
+ armor = list("melee" = 70, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
+ slowdown = 1
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/miner
+ name = "champion's helmet"
+ desc = "Peering into the eyes of the helmet is enough to seal damnation."
+ icon_state = "hardsuit0-beserker"
+ item_state = "hardsuit0-beserker"
+ armor = list("melee" = 70, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 80)
+
/obj/item/clothing/head/helmet/space/fragile
name = "emergency space helmet"
desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable."
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index de1fc11f..a12f1491 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -58,7 +58,7 @@
if(inert)
to_chat(owner, "[src] breaks down as it tries to activate.")
else
- owner.revive(full_heal = 1)
+ owner.legion_heal()
qdel(src)
/obj/item/organ/regenerative_core/on_life()
@@ -78,12 +78,13 @@
to_chat(user, "[src] are useless on the dead.")
return
if(H != user)
- H.visible_message("[user] forces [H] to apply [src]... they quickly regenerate all injuries!")
+ H.visible_message("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()].")
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other"))
else
- to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.")
+ to_chat(user, "You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
- H.revive(full_heal = 1)
+ H.legion_heal()
+ SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/healsbadman)
qdel(src)
/obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index c0c77efa..cf5b8199 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -18,7 +18,7 @@
if(2)
new /obj/item/clothing/suit/space/hardsuit/cult(src)
if(3)
- new /obj/item/soulstone/anybody(src)
+ new /obj/item/nullrod(src)
if(4)
new /obj/item/katana/cursed(src)
if(5)
@@ -39,7 +39,7 @@
if(11)
new /obj/item/ship_in_a_bottle(src)
if(12)
- new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/miner(src)
if(13)
new /obj/item/jacobs_ladder(src)
if(14)
@@ -60,14 +60,14 @@
if(20)
new /obj/item/immortality_talisman(src)
if(21)
- new /obj/item/gun/magic/hook(src)
+ new /obj/item/gun/medbeam(src)
if(22)
- new /obj/item/voodoo(src)
+ new /obj/item/circuitboard/machine/plantgenes/vault
if(23)
- new /obj/item/grenade/clusterbuster/inferno(src)
+ new /obj/item/grenade/clusterbuster/soap(src)
if(24)
new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
- new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/miner(src)
if(25)
new /obj/item/book/granter/spell/summonitem(src)
if(26)
@@ -77,6 +77,8 @@
new /obj/item/bedsheet/cult(src)
if(28)
new /obj/item/clothing/neck/necklace/memento_mori(src)
+// if(29)
+// new /obj/item/clothing/gloves/gauntlets(src)
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
@@ -1423,3 +1425,43 @@
attack_self(user)
return
..()
+
+//Concussive Gauntlets
+/obj/item/clothing/gloves/gauntlets
+ name = "concussive gauntlets"
+ desc = "Pickaxes... for your hands!"
+ icon_state = "concussive_gauntlets"
+ item_state = "concussive_gauntlets"
+ toolspeed = 0.1
+ strip_delay = 40
+ equip_delay_other = 20
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ resistance_flags = LAVA_PROOF | FIRE_PROOF //they are from lavaland after all
+ armor = list("melee" = 15, "bullet" = 25, "laser" = 15, "energy" = 15, "bomb" = 100, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 30) //mostly bone bracer armor
+
+/obj/item/clothing/gloves/gauntlets/equipped(mob/user, slot)
+ . = ..()
+ if(slot == ITEM_SLOT_GLOVES)
+ tool_behaviour = TOOL_MINING
+ RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/rocksmash)
+ RegisterSignal(user, COMSIG_MOVABLE_BUMP, .proc/rocksmash)
+ else
+ stopmining(user)
+
+/obj/item/clothing/gloves/gauntlets/dropped(mob/user)
+ . = ..()
+ stopmining(user)
+
+/obj/item/clothing/gloves/gauntlets/proc/stopmining(mob/user)
+ tool_behaviour = initial(tool_behaviour)
+ UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
+ UnregisterSignal(user, COMSIG_MOVABLE_BUMP)
+
+/obj/item/clothing/gloves/gauntlets/proc/rocksmash(mob/living/carbon/human/H, atom/A, proximity)
+ if(!istype(A, /turf/closed/mineral))
+ return
+ A.attackby(src, H)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index affafe34..5b8bf4bc 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -544,6 +544,20 @@
O.setOrganDamage(0)
SEND_SIGNAL(src, COMSIG_LIVING_FULLY_HEAL, admin_revive)
+//fuck shitcode I hate shitcode
+/mob/living/proc/legion_heal()
+ restore_blood()
+ setStaminaLoss(0, 0)
+ SetUnconscious(0, FALSE)
+ SetStun(0, FALSE)
+ SetKnockdown(0, FALSE)
+ SetSleeping(0, FALSE)
+ bodytemperature = BODYTEMP_NORMAL
+ heal_overall_damage(INFINITY, INFINITY, INFINITY, FALSE, FALSE, TRUE) //heal brute and burn dmg on both organic and robotic limbs, and update health right away.
+ ExtinguishMob()
+ fire_stacks = 0
+ update_canmove()
+ SEND_SIGNAL(src, COMSIG_LIVING_FULLY_HEAL)
//proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again)
/mob/living/proc/can_be_revived()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index f6761dd1..dc112ab6 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -269,7 +269,7 @@
H.dna.add_mutation(DWARFISM)
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize()
- var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist", "Lavaknight")) = 4)) //CIT CHANGE: Lavaknights
+ var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde", "Cultist", "Lavaknight")) = 4)) //CIT CHANGE: Lavaknights
switch(type)
if("Miner")
mob_species = pickweight(list(/datum/species/human = 70, /datum/species/lizard = 26, /datum/species/fly = 2, /datum/species/plasmaman = 2))
@@ -346,9 +346,6 @@
belt = /obj/item/nullrod/claymore
r_pocket = /obj/item/tank/internals/emergency_oxygen
mask = /obj/item/clothing/mask/breath
- if("Operative")
- id_job = "Operative"
- outfit = /datum/outfit/syndicatecommandocorpse
if("Shadow")
mob_species = /datum/species/shadow
r_pocket = /obj/item/reagent_containers/pill/shadowtoxin
diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
index b8bdffba..1dac2d42 100644
--- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
@@ -142,3 +142,19 @@ Slimecrossing Armor
return TRUE
else
return FALSE
+
+/obj/structure/light_prism/spectral
+ name = "spectral light prism"
+ desc = "You could barely see this, huh!"
+ icon = 'icons/obj/slimecrossing.dmi'
+ icon_state = ""
+ density = FALSE
+ anchored = TRUE
+ max_integrity = 10
+ var/newcolor = "#ff66ff"
+
+/obj/structure/light_prism/Initialize(mapload, var/newcolor)
+ . = ..()
+ color = newcolor
+ light_color = newcolor
+ set_light(5)
\ No newline at end of file
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index 2b4d8747..18e90b3a 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -144,3 +144,154 @@
user.size_multiplier = H.size_multiplier
user.visible_message("[user]'s appearance shifts into [H]'s!", \
"[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't.")
+
+/obj/item/reagent_containers/chalice
+ name = "Curse of Lust"
+ desc = "You shouldn't see this! If you do, tell the gods something is wrong."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "cumchalice"
+
+/obj/item/reagent_containers/chalice/lust
+ name = "Golden Chalice of Lust"
+ desc = "A beautiful golden chalice, centered with a gleaming pink jewel of unknown origin. It is still slightly damp with aphrodisiac. It smells faintly of strawberries and roofies."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "cumchalice"
+ w_class = WEIGHT_CLASS_SMALL
+ force = 1
+ throwforce = 1
+ amount_per_transfer_from_this = 5
+ volume = 15
+ flags_1 = CONDUCT_1
+ spillable = TRUE
+ resistance_flags = INDESTRUCTIBLE
+ reagent_flags = AMOUNT_VISIBLE
+
+/obj/item/reagent_containers/chalice/lust/Initialize() //just in case
+ beaker_weakness_bitflag &= ~PH_WEAK
+ . = ..()
+
+/obj/item/reagent_containers/chalice/lust/attack_self(mob/living/carbon/human/user)
+ var/thecostofhorny = 0
+ var/truecostofhorny = 0
+ var/choicechem = /datum/reagent/water
+ var/choice = "Water"
+ var/free = src.reagents.maximum_volume - src.reagents.total_volume
+ if(free <= 0)
+ return
+
+ if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK))
+ return
+
+ choice = input(user, "Go ahead, pick your poison~", "Boon of Lust") as null|anything in list("Crocin", "Hexacrocin","Succubus Milk", "Incubus Draft", "Prospacillin", "Diminicillin", "Semen", "Femcum", "Milk", "Alien Honey")
+
+ switch(choice)
+ if("Crocin")
+ choicechem = /datum/reagent/drug/aphrodisiac
+ thecostofhorny = 5
+ if("Hexacrocin")
+ choicechem = /datum/reagent/drug/aphrodisiacplus
+ thecostofhorny = 5
+ if("Succubus Milk")
+ choicechem = /datum/reagent/fermi/breast_enlarger
+ thecostofhorny = 5
+ if("Incubus Draft")
+ choicechem = /datum/reagent/fermi/penis_enlarger
+ thecostofhorny = 5
+ if("Prospacillin")
+ choicechem = /datum/reagent/growthchem
+ thecostofhorny = 40 //Rare chem, should be very expensive
+ if("Diminicillin")
+ choicechem = /datum/reagent/shrinkchem
+ thecostofhorny = 40 //Rare chem, should be very expensive
+ if("Semen")
+ choicechem = /datum/reagent/consumable/semen
+ thecostofhorny = 1
+ if("Femcum")
+ choicechem = /datum/reagent/consumable/femcum
+ thecostofhorny = 1
+ if("Milk")
+ choicechem = /datum/reagent/consumable/milk
+ thecostofhorny = 3 //fuck you chef
+ if("Alien Honey")
+ choicechem = /datum/reagent/consumable/alienhoney
+ thecostofhorny = 1
+
+ var/makechems = alert(user, "Are you sure you want to make [choice]?", "Boon of Lust", "Yes", "No")
+ switch(makechems)
+ if("Yes")
+ src.reagents.add_reagent(choicechem, 5)
+ truecostofhorny = (thecostofhorny*user.size_multiplier)
+ user.adjustCloneLoss(truecostofhorny, 1)
+ user.adjustArousalLoss(100, 1)
+ to_chat(user, "You feel part of your body ripped from you violently, before the beaker fills itself with [choice].")
+ if("No")
+ return
+
+
+/obj/item/reagent_containers/chalice/lust/attack(mob/M, mob/user, obj/target)
+ if(!canconsume(M, user))
+ return
+
+ if(!spillable)
+ return
+
+ if(!reagents || !reagents.total_volume)
+ to_chat(user, "[src] is empty!")
+ return
+
+ if(istype(M))
+ if(user.a_intent == INTENT_HARM)
+ M.visible_message("[user] splashes the contents of [src] onto [M]!", \
+ "[user] splashes the contents of [src] onto [M]!")
+ var/R = reagents?.log_list()
+ if(isturf(target) && reagents.reagent_list.len && thrownby)
+ log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]")
+ message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
+ reagents.reaction(M, TOUCH)
+ log_combat(user, M, "splashed", R)
+ reagents.clear_reagents()
+ else
+ if(M != user)
+ M.visible_message("[user] attemped to feed something to [M], but failed!")
+ return
+ else
+ to_chat(user, "You swallow a gulp of [src].")
+ var/fraction = min(5/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
+ addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+
+/obj/structure/lewdfountain
+ name = "Lewd Fountain"
+ desc = "You shouldn't see this!"
+ icon = 'icons/obj/hand_of_god_structures.dmi'
+ icon_state = "fountain"
+ anchored = TRUE
+ density = TRUE
+
+/obj/structure/lewdfountain/lust
+ name = "fountain of lust"
+ desc = "A beautiful hand carved fountain, with a carved golden cup atop it. The cup seems to be constantly overflowing with a pink fluid that smells like liquid desire. Just looking at it makes you turned on."
+ icon = 'icons/obj/hand_of_god_structures.dmi'
+ icon_state = "fountain"
+ anchored = TRUE
+ density = TRUE
+ var/chalice_taken = 0
+
+/obj/structure/lewdfountain/lust/attack_hand(mob/living/user)
+ . = ..()
+ if(.)
+ return
+ if(chalice_taken == 1)
+ to_chat(user, "You hear a voice in your head... \"My chalice has already been taken, dear. I cannot give you another...\"")
+ return
+ if(user.getArousalLoss() < 100)
+ to_chat(user, "You hear a voice in your head... \"You are not horny enough to receive my blessing, dear~\"")
+ return
+ if (ishuman(user) && user.has_dna())
+ user.mob_climax(forced_climax=TRUE)
+ to_chat(user, "You hear a voice in your head... \"You are worth of my blessing dear~\"")
+ to_chat(user, "You feel overpowering pleasure surge through your entire body.")
+ var/A = new /obj/item/reagent_containers/chalice/lust
+ user.put_in_hands(A)
+ chalice_taken = 1
\ No newline at end of file
diff --git a/config/lavaRuinBlacklist.txt b/config/lavaRuinBlacklist.txt
index 2691f317..18a83d61 100644
--- a/config/lavaRuinBlacklist.txt
+++ b/config/lavaRuinBlacklist.txt
@@ -7,7 +7,7 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm
#_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm
#_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm
-#_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm
+_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm
##RESPAWN
#_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm
@@ -21,6 +21,7 @@
#_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm
#_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm
+#_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm
##MISC
#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm
diff --git a/hyperstation/code/datums/mood_events/events.dm b/hyperstation/code/datums/mood_events/events.dm
index 2a5e66f8..6ef7c115 100644
--- a/hyperstation/code/datums/mood_events/events.dm
+++ b/hyperstation/code/datums/mood_events/events.dm
@@ -16,4 +16,9 @@
/datum/mood_event/deathsaw
description = "I saw someone die!\n"
mood_change = -8
- timeout = 20 MINUTES //takes a long time to get over
\ No newline at end of file
+ timeout = 20 MINUTES //takes a long time to get over
+
+/datum/mood_event/healsbadman
+ description = "I feel like I'm held together by flimsy string, and could fall apart at any moment!\n"
+ mood_change = -4
+ timeout = 2 MINUTES
\ No newline at end of file
diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi
index fea1cd54..1339c6a3 100644
Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 53612571..e75cf091 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index b38bc4a1..b0fc76df 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ