diff --git a/_maps/RandomRuins/LavaRuins/kinggoatboss.dmm b/_maps/RandomRuins/LavaRuins/kinggoatboss.dmm
new file mode 100644
index 0000000000..021a0f4285
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/kinggoatboss.dmm
@@ -0,0 +1,335 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/indestructible/riveted/uranium,
+/area/ruin/powered/kinggoat_arena)
+"b" = (
+/turf/open/indestructible/diamond,
+/area/ruin/powered/kinggoat_arena)
+"c" = (
+/obj/structure/chair/bronze,
+/mob/living/simple_animal/hostile/megafauna/king,
+/turf/open/indestructible/diamond,
+/area/ruin/powered/kinggoat_arena)
+"d" = (
+/mob/living/simple_animal/hostile/retaliate/goat/guard/pope,
+/turf/open/indestructible/diamond,
+/area/ruin/powered/kinggoat_arena)
+"e" = (
+/obj/structure/ladder/unbreakable/kinggoat/goat2,
+/turf/open/indestructible/diamond,
+/area/ruin/powered/kinggoat_arena)
+"f" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors/explored)
+"g" = (
+/turf/closed/wall/mineral/silver,
+/area/ruin/powered)
+"h" = (
+/obj/effect/mob_spawn/human/miner{
+ assignedrole = "null";
+ desc = "Seems this miner tried to cheese the arena using bluespace crystals. Did not turn out well";
+ mob_gender = "female";
+ mob_name = "Lyna Lavas";
+ name = "Lyna Lavas"
+ },
+/obj/item/stack/ore/bluespace_crystal,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/mineral/gold,
+/area/ruin/powered)
+"i" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/mineral/gold,
+/area/ruin/powered)
+"j" = (
+/turf/open/floor/mineral/gold,
+/area/ruin/powered)
+"k" = (
+/turf/closed/wall/mineral/gold,
+/area/ruin/powered)
+"l" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/mineral/gold,
+/area/ruin/powered)
+"m" = (
+/turf/open/floor/mineral/diamond,
+/area/ruin/powered)
+"n" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/mineral/gold,
+/area/ruin/powered)
+"o" = (
+/obj/structure/mineral_door/transparent/diamond{
+ sheetAmount = 1
+ },
+/turf/open/floor/mineral/silver,
+/area/ruin/powered)
+"p" = (
+/obj/structure/ladder/unbreakable/kinggoat,
+/turf/open/indestructible/gold,
+/area/ruin/powered)
+"q" = (
+/obj/item/paper/crumpled{
+ info = "Lest ye be prepared, abandon all hope ye who enter here.";
+ name = "Wise Man's Warning."
+ },
+/obj/effect/decal/remains/human,
+/turf/open/floor/mineral/diamond,
+/area/ruin/powered)
+"r" = (
+/obj/machinery/light,
+/turf/open/floor/mineral/gold,
+/area/ruin/powered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+f
+f
+f
+f
+f
+f
+"}
+(2,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+f
+f
+f
+f
+f
+f
+"}
+(3,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+f
+f
+f
+f
+f
+f
+"}
+(4,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+g
+k
+o
+k
+g
+g
+"}
+(5,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+h
+l
+j
+l
+j
+g
+"}
+(6,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+i
+m
+m
+m
+r
+k
+"}
+(7,1,1) = {"
+a
+c
+b
+b
+b
+b
+b
+b
+b
+e
+a
+j
+m
+p
+q
+j
+o
+"}
+(8,1,1) = {"
+a
+d
+b
+b
+b
+b
+b
+b
+b
+b
+a
+i
+m
+m
+m
+r
+k
+"}
+(9,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+j
+n
+j
+n
+j
+g
+"}
+(10,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+g
+k
+o
+k
+g
+g
+"}
+(11,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+f
+f
+f
+f
+f
+f
+"}
+(12,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+f
+f
+f
+f
+f
+f
+"}
+(13,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+f
+f
+f
+f
+f
+f
+"}
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_rogue.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_rogue.dmm
new file mode 100644
index 0000000000..9c7bf5b2d6
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_rogue.dmm
@@ -0,0 +1,734 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/mineral/titanium/volcanic,
+/area/ruin/space/has_grav/powered)
+"c" = (
+/turf/closed/mineral/uranium/volcanic,
+/area/ruin/space/has_grav/powered)
+"d" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"e" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"f" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"h" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"i" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"j" = (
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"k" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"l" = (
+/mob/living/simple_animal/hostile/megafauna/rogueprocess,
+/turf/open/floor/mech_bay_recharge_floor,
+/area/ruin/space/has_grav/powered)
+"p" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"q" = (
+/obj/effect/turf_decal/caution/stand_clear/red{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/closed,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"s" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"t" = (
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"u" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"x" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"C" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"E" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"H" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"I" = (
+/obj/effect/turf_decal/caution/stand_clear/red{
+ dir = 4
+ },
+/obj/machinery/door/firedoor/closed,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"M" = (
+/obj/effect/turf_decal/caution/stand_clear/red{
+ dir = 8
+ },
+/obj/machinery/door/firedoor/closed,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"N" = (
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"O" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"P" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"R" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"S" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+"T" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/space/has_grav/powered)
+"U" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"W" = (
+/obj/effect/turf_decal/caution/stand_clear/red,
+/obj/machinery/door/firedoor/closed,
+/turf/open/floor/plasteel/rockvault,
+/area/ruin/space/has_grav/powered)
+"X" = (
+/turf/open/floor/circuit/green/anim,
+/area/ruin/space/has_grav/powered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+c
+c
+c
+c
+T
+T
+T
+T
+T
+T
+M
+T
+T
+T
+T
+T
+T
+c
+c
+c
+c
+a
+"}
+(3,1,1) = {"
+a
+c
+c
+T
+T
+T
+T
+j
+j
+j
+s
+X
+E
+j
+j
+j
+T
+T
+T
+T
+c
+c
+a
+"}
+(4,1,1) = {"
+a
+c
+T
+T
+T
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+T
+T
+T
+c
+a
+"}
+(5,1,1) = {"
+a
+c
+T
+T
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+T
+T
+c
+a
+"}
+(6,1,1) = {"
+a
+T
+T
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+T
+T
+a
+"}
+(7,1,1) = {"
+a
+T
+T
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+T
+T
+a
+"}
+(8,1,1) = {"
+a
+T
+j
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+j
+T
+a
+"}
+(9,1,1) = {"
+a
+T
+j
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+j
+T
+a
+"}
+(10,1,1) = {"
+a
+T
+j
+j
+j
+j
+j
+j
+j
+N
+d
+X
+C
+f
+j
+j
+j
+j
+j
+j
+j
+T
+a
+"}
+(11,1,1) = {"
+a
+T
+O
+O
+O
+O
+O
+O
+O
+d
+t
+e
+p
+C
+O
+O
+O
+O
+O
+O
+O
+T
+a
+"}
+(12,1,1) = {"
+a
+q
+X
+X
+X
+X
+X
+X
+X
+X
+x
+l
+H
+X
+X
+X
+X
+X
+X
+X
+X
+W
+a
+"}
+(13,1,1) = {"
+a
+T
+u
+u
+u
+u
+u
+u
+u
+i
+S
+P
+R
+U
+u
+u
+u
+u
+u
+u
+u
+T
+a
+"}
+(14,1,1) = {"
+a
+T
+j
+j
+j
+j
+j
+j
+j
+k
+i
+X
+U
+h
+j
+j
+j
+j
+j
+j
+j
+T
+a
+"}
+(15,1,1) = {"
+a
+T
+j
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+j
+T
+a
+"}
+(16,1,1) = {"
+a
+T
+j
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+j
+T
+a
+"}
+(17,1,1) = {"
+a
+T
+T
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+T
+T
+a
+"}
+(18,1,1) = {"
+a
+T
+T
+j
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+j
+T
+T
+a
+"}
+(19,1,1) = {"
+a
+c
+T
+T
+j
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+j
+T
+T
+c
+a
+"}
+(20,1,1) = {"
+a
+c
+T
+T
+T
+j
+j
+j
+j
+j
+s
+X
+E
+j
+j
+j
+j
+j
+T
+T
+T
+c
+a
+"}
+(21,1,1) = {"
+a
+c
+c
+T
+T
+T
+T
+j
+j
+j
+s
+X
+E
+j
+j
+j
+T
+T
+T
+T
+c
+c
+a
+"}
+(22,1,1) = {"
+a
+c
+c
+c
+c
+T
+T
+T
+T
+T
+T
+I
+T
+T
+T
+T
+T
+T
+c
+c
+c
+c
+a
+"}
+(23,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sif_spawn.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sif_spawn.dmm
new file mode 100644
index 0000000000..2ca0b8889a
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sif_spawn.dmm
@@ -0,0 +1,985 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"c" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"d" = (
+/obj/structure/sword/sif,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"e" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"f" = (
+/obj/item/storage/bag/easterbasket,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/sif)
+"g" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/sif)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+c
+c
+c
+a
+a
+a
+c
+c
+c
+c
+a
+b
+b
+b
+a
+c
+c
+c
+c
+a
+a
+a
+a
+c
+c
+a
+a
+"}
+(3,1,1) = {"
+a
+a
+c
+c
+c
+c
+a
+a
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(4,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(5,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(7,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(8,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(9,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(10,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(11,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(12,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+e
+c
+c
+c
+c
+c
+a
+"}
+(13,1,1) = {"
+a
+c
+c
+c
+c
+c
+b
+c
+c
+c
+b
+c
+c
+b
+b
+b
+b
+b
+c
+c
+c
+c
+b
+b
+b
+c
+c
+a
+a
+a
+"}
+(14,1,1) = {"
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+d
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+"}
+(15,1,1) = {"
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+"}
+(16,1,1) = {"
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+"}
+(17,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+b
+b
+b
+b
+b
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+a
+"}
+(18,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(19,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(20,1,1) = {"
+a
+c
+c
+c
+c
+c
+b
+b
+c
+c
+c
+c
+c
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(21,1,1) = {"
+c
+c
+c
+c
+c
+b
+e
+b
+c
+c
+c
+b
+b
+b
+b
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(22,1,1) = {"
+c
+c
+c
+c
+b
+e
+e
+e
+b
+c
+b
+b
+b
+b
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(23,1,1) = {"
+a
+c
+c
+c
+e
+e
+g
+e
+b
+c
+c
+c
+b
+c
+b
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(24,1,1) = {"
+a
+c
+c
+c
+b
+e
+f
+e
+e
+c
+c
+c
+c
+c
+b
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(25,1,1) = {"
+a
+c
+c
+c
+e
+e
+e
+e
+b
+c
+c
+c
+c
+c
+b
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(26,1,1) = {"
+a
+a
+c
+c
+c
+c
+e
+b
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+a
+"}
+(27,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(28,1,1) = {"
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+a
+"}
+(29,1,1) = {"
+a
+a
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+c
+b
+b
+b
+c
+c
+a
+c
+c
+c
+a
+a
+a
+a
+a
+a
+a
+"}
+(30,1,1) = {"
+a
+a
+a
+a
+a
+a
+c
+a
+a
+a
+a
+c
+c
+a
+b
+b
+b
+a
+a
+a
+a
+c
+a
+a
+a
+a
+a
+a
+a
+a
+"}
diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm
new file mode 100644
index 0000000000..7528d456b4
--- /dev/null
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm
@@ -0,0 +1,477 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"b" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"c" = (
+/turf/open/lava/smooth/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"d" = (
+/turf/closed/indestructible/necropolis,
+/area/ruin/powered/wrath)
+"e" = (
+/turf/open/chasm/magic,
+/area/ruin/powered/wrath)
+"f" = (
+/obj/item/banhammer,
+/obj/item/katana/goldbrand,
+/turf/open/indestructible/necropolis/air,
+/area/ruin/powered/wrath)
+"g" = (
+/obj/effect/wrath,
+/turf/open/indestructible/necropolis/air,
+/area/ruin/powered/wrath)
+"h" = (
+/turf/open/indestructible/necropolis/air,
+/area/ruin/powered/wrath)
+"i" = (
+/obj/machinery/door/airlock/cult/unruned/friendly,
+/turf/open/indestructible/necropolis/air,
+/area/ruin/powered/wrath)
+"j" = (
+/obj/machinery/door/airlock/cult/friendly,
+/turf/open/indestructible/necropolis/air,
+/area/ruin/powered/wrath)
+
+(1,1,1) = {"
+a
+a
+a
+b
+b
+a
+a
+b
+a
+b
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+a
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+a
+a
+a
+"}
+(3,1,1) = {"
+b
+a
+a
+a
+b
+b
+b
+c
+c
+c
+b
+c
+c
+c
+b
+b
+a
+a
+a
+a
+"}
+(4,1,1) = {"
+b
+a
+a
+a
+b
+b
+b
+c
+d
+d
+i
+d
+d
+c
+b
+a
+a
+a
+a
+a
+"}
+(5,1,1) = {"
+b
+b
+a
+a
+a
+b
+b
+c
+d
+h
+h
+h
+d
+c
+b
+a
+a
+a
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+a
+a
+a
+b
+b
+c
+d
+h
+h
+h
+d
+c
+b
+b
+b
+b
+b
+a
+"}
+(7,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+c
+d
+h
+h
+h
+d
+c
+b
+b
+b
+b
+b
+a
+"}
+(8,1,1) = {"
+a
+b
+c
+c
+c
+c
+c
+c
+d
+h
+h
+h
+d
+c
+c
+c
+c
+c
+c
+b
+"}
+(9,1,1) = {"
+b
+b
+c
+d
+d
+d
+d
+d
+d
+h
+h
+h
+d
+d
+d
+d
+d
+d
+c
+b
+"}
+(10,1,1) = {"
+a
+b
+c
+d
+e
+d
+g
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+d
+c
+b
+"}
+(11,1,1) = {"
+a
+b
+c
+d
+f
+h
+g
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+j
+b
+b
+"}
+(12,1,1) = {"
+a
+b
+c
+d
+e
+d
+g
+h
+h
+h
+h
+h
+h
+h
+h
+h
+h
+d
+c
+b
+"}
+(13,1,1) = {"
+a
+b
+c
+d
+d
+d
+d
+d
+d
+h
+h
+h
+d
+d
+d
+d
+d
+d
+c
+b
+"}
+(14,1,1) = {"
+a
+b
+c
+c
+c
+c
+c
+c
+d
+h
+h
+h
+d
+c
+c
+c
+c
+c
+c
+b
+"}
+(15,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+c
+d
+h
+h
+h
+d
+c
+b
+b
+b
+b
+b
+b
+"}
+(16,1,1) = {"
+b
+b
+b
+a
+b
+b
+b
+c
+d
+h
+h
+h
+d
+c
+b
+b
+b
+a
+a
+a
+"}
+(17,1,1) = {"
+b
+b
+b
+a
+b
+b
+b
+c
+d
+h
+h
+h
+d
+c
+b
+b
+b
+a
+a
+a
+"}
+(18,1,1) = {"
+a
+a
+a
+a
+b
+b
+b
+c
+d
+d
+i
+d
+d
+c
+b
+b
+b
+a
+a
+a
+"}
+(19,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+c
+c
+c
+b
+c
+c
+c
+b
+b
+a
+a
+a
+a
+"}
+(20,1,1) = {"
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+b
+b
+b
+a
+a
+b
+a
+a
+a
+"}
diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm
index a772122491..53fb41ced5 100644
--- a/_maps/map_files/Mining/Lavaland.dmm
+++ b/_maps/map_files/Mining/Lavaland.dmm
@@ -1220,13 +1220,7 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mH" = (
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/structure/stone_tile,
+/obj/effect/step_trigger/gladiator,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mI" = (
@@ -1239,60 +1233,13 @@
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mJ" = (
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile{
- dir = 4
- },
+/mob/living/simple_animal/hostile/megafauna/gladiator,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"mK" = (
/obj/structure/stone_tile{
- dir = 4
- },
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
dir = 1
},
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"mL" = (
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"mM" = (
-/obj/structure/stone_tile/cracked,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"mN" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"mO" = (
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"mP" = (
-/obj/structure/stone_tile{
- dir = 8
- },
/obj/structure/stone_tile/cracked{
dir = 4
},
@@ -32891,22 +32838,22 @@ aj
aj
aj
ab
-ab
+ak
+ak
+al
+al
+al
ab
al
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+al
+al
+jx
+ab
+al
+al
+al
+al
+al
ak
ak
ak
@@ -33148,23 +33095,23 @@ aj
aj
aj
aj
-mD
+ak
+al
+al
+al
+kN
ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ab
+al
+ab
+kN
+ab
+ab
+al
+ab
+kN
+al
+al
ak
ak
ak
@@ -33405,23 +33352,23 @@ mA
aj
aj
aj
-ab
-ab
-ak
-ak
-ak
-ak
-ak
ak
al
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ab
+jx
+ab
+jq
+ab
+ab
+jx
+ab
+jq
+ab
+ab
+ab
+jx
+ab
+al
ak
ak
ak
@@ -33662,17 +33609,23 @@ aj
aj
aj
aj
-ab
+al
jQ
-ak
-ak
-ak
-ak
-al
-iy
+ab
+kN
+ab
+ab
+ab
+ab
+kN
+ab
+ab
+ab
+jq
+ab
+kN
ab
ab
-mK
al
ak
ak
@@ -33851,12 +33804,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
-ak
am
am
am
@@ -33921,16 +33868,21 @@ aj
aj
ab
ab
-ak
-ak
-ak
-ak
-ab
+ja
ab
jx
ab
ab
-mM
+ja
+ab
+jx
+ab
+ab
+ab
+jx
+ab
+jq
+ab
al
ak
ak
@@ -34110,11 +34062,6 @@ ak
ak
ak
ak
-ak
-ak
-ak
-ak
-ak
am
am
am
@@ -34178,21 +34125,21 @@ aj
aj
jx
jS
-iy
-al
-ak
-al
-jq
+jR
+ab
+ab
+ab
+mK
+jR
+ab
+ab
+ab
+mK
ab
kN
ab
ab
-jx
ab
-ab
-mN
-al
-ak
ak
ak
ak
@@ -34445,11 +34392,11 @@ ab
jq
ab
kN
+ja
+ab
+jx
ab
ab
-ab
-mO
-ak
ak
ak
ak
@@ -34690,7 +34637,7 @@ lp
lZ
lS
lS
-lp
+mH
aa
mE
ab
@@ -34702,11 +34649,11 @@ ab
ab
ab
ab
-ab
-jS
+jR
ab
ab
-al
+ab
+mK
ak
ak
ak
@@ -34947,10 +34894,10 @@ lW
ma
lq
mk
-mn
-kR
+mH
+mH
mF
-ab
+mJ
mG
ab
ja
@@ -34964,7 +34911,7 @@ ab
jq
jR
ab
-ab
+al
ak
ak
ak
@@ -35204,7 +35151,7 @@ lv
mb
lR
ml
-lR
+mH
aa
it
ab
@@ -35214,9 +35161,9 @@ jR
ab
ab
ab
-mL
-al
-iY
+ab
+jx
+ab
ab
ab
jQ
@@ -35470,16 +35417,16 @@ ab
jQ
ab
mI
+jq
ab
+kN
ab
-al
-al
ab
ab
ab
ab
ab
-ak
+al
ak
ak
ak
@@ -35728,10 +35675,10 @@ ab
ab
ab
ab
+jx
+ab
+jq
ab
-jR
-ak
-jS
kN
ab
ab
@@ -35977,21 +35924,21 @@ aj
aj
ab
ab
-ak
-al
-ja
-ab
-mH
ab
ab
-mJ
-al
-ak
-ak
-al
+jx
+ab
+ab
+ab
+jx
+ab
+ab
+ab
+jx
+ab
+ab
ab
ab
-mP
al
ak
ak
@@ -36234,21 +36181,21 @@ aj
aj
ab
ja
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+jq
+ab
+kN
+ab
+jq
+ab
+kN
+ja
+jq
+ab
+kN
+ab
+ab
+ab
+ab
ak
ak
ak
@@ -36489,24 +36436,24 @@ iy
aj
aj
aj
-kN
+al
ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+ab
+jx
+ab
+jq
+ab
+jx
+ab
+jR
+ab
+jx
+ab
+jq
+ab
+jq
+ab
+al
ak
ak
ak
@@ -36746,23 +36693,23 @@ aj
aj
aj
aj
+ak
ab
ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+kN
+ab
+ab
+al
+kN
+ab
+ab
+ab
+kN
+ab
+ab
+ab
+ab
+al
ak
ak
ak
@@ -37003,23 +36950,23 @@ aj
aj
ab
ab
+ak
+al
+al
ab
+jx
+al
+al
ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+jx
+ab
+ja
+ab
+jx
+ab
+al
+al
+al
ak
ak
ak
@@ -37260,23 +37207,23 @@ aj
aj
mC
ab
+ak
+ak
+al
+al
+al
+al
+al
+al
ab
+al
+al
+al
+al
ab
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
+al
+al
+al
ak
ak
ak
diff --git a/code/__DEFINES/__512_compatibility_sandstorm.dm b/code/__DEFINES/__512_compatibility_sandstorm.dm
new file mode 100644
index 0000000000..6ab31d508f
--- /dev/null
+++ b/code/__DEFINES/__512_compatibility_sandstorm.dm
@@ -0,0 +1,39 @@
+#if DM_VERSION < 513
+
+#define ismovable(A) (istype(A, /atom/movable))
+
+#define islist(L) (istype(L, /list))
+
+#define clamp(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
+
+#define TAN(x) (sin(x) / cos(x))
+
+#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
+
+#define arctan(x) (arcsin(x/sqrt(1+x*x)))
+
+#else
+
+#define TAN(x) tan(x)
+
+#define ATAN2(x, y) arctan(x, y)
+
+#endif
+
+#if DM_BUILD < 1493
+#define length_char(args...) length(args)
+#define text2ascii_char(args...) text2ascii(args)
+#define copytext_char(args...) copytext(args)
+#define splittext_char(args...) splittext(args)
+#define spantext_char(args...) spantext(args)
+#define nonspantext_char(args...) nonspantext(args)
+#define findtext_char(args...) findtext(args)
+#define findtextEx_char(args...) findtextEx(args)
+#define findlasttext_char(args...) findlasttext(args)
+#define findlasttextEx_char(args...) findlasttextEx(args)
+#define replacetext_char(args...) replacetext(args)
+#define replacetextEx_char(args...) replacetextEx(args)
+// /regex procs
+#define Find_char(args...) Find(args)
+#define Replace_char(args...) Replace(args)
+#endif
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 325fb0669c..d4f65c03a0 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -17,9 +17,9 @@
#define COMBOHUD_LIGHTING (1<<14)
#define VERB_CONSENT (1<<15) // Skyrat - ERP Mechanic Addition
#define LEWD_VERB_SOUNDS (1<<16) // Skyrat - ERP Mechanic Addition
-#define ASYNCHRONOUS_SAY (1<<17) // Skyrat - Asynchronous say/me verb for speech indicator
+#define SOUND_BOSS_MUSIC (1<<17) // Sandstorm - New Lavaland bosses have musics
-#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|ASYNCHRONOUS_SAY) //Skyrat change - added ASYNCHRONOUS_SAY
+#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|SOUND_BOSS_MUSIC) //(Sandcode Addition - SOUND_BOSS_MUSIC)
//Chat toggles
#define CHAT_OOC (1<<0)
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 73781154c5..b74198900a 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -15,10 +15,13 @@
#define CHANNEL_DIGEST 1009
#define CHANNEL_PREYLOOP 1008
+//SANDCODE CHANNELS - SEND HELP
+#define CHANNEL_BOSSMUSIC 1007
+
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
//KEEP IT UPDATED
-#define CHANNEL_HIGHEST_AVAILABLE 1008 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS
+#define CHANNEL_HIGHEST_AVAILABLE 1007 //CIT CHANGE - COMPENSATES FOR VORESOUND CHANNELS(oopsie, sandcode mod)
#define MAX_INSTRUMENT_CHANNELS (128 * 6)
diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm
index c861259cea..094f97556b 100644
--- a/code/datums/chatmessage.dm
+++ b/code/datums/chatmessage.dm
@@ -170,8 +170,8 @@
addtimer(CALLBACK(src, .proc/end_of_life), lifespan - CHAT_MESSAGE_EOL_FADE, TIMER_UNIQUE|TIMER_OVERRIDE)
//dogborg check sandstorm thingy thing.
- var/mob/living/silicon/robot/R = target
- if(owner == R) //without this it would check for module on every mob speaking, and you would NOT remove this unless you love runtimes
+ var/mob/living/silicon/robot/R = owner
+ if(iscyborg(R)) //without this it would check for module on every mob speaking, and you would NOT remove this unless you love runtimes
if(R.module.dogborg == TRUE)
message.pixel_x = 16
else
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index 1fbeee7523..8476e02d29 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -335,7 +335,7 @@
if(!spawned_flora) // no rocks beneath mob spawners / mobs.
SpawnMonster(T)
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
-
+/*
/// Spawns a random mob or megafauna in the tunnel
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
if(!isarea(loc))
@@ -367,7 +367,7 @@
new randumb(T)
return TRUE
-
+*/ //moved to sandcode
#undef SPAWN_MEGAFAUNA
#undef SPAWN_BUBBLEGUM
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 951e36f9a6..208bbabc51 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -132,6 +132,23 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggletitlemusic)()
/datum/verbs/menu/Settings/Sound/toggletitlemusic/Get_checked(client/C)
return C.prefs.toggles & SOUND_LOBBY
+//Sandstorm additions
+TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, Toggle_BossMusic)()
+ set name = "Hear/Silence Boss Musics"
+ set category = "Preferences"
+ set desc = "Hear Boss Musics"
+ usr.client.prefs.toggles ^= SOUND_BOSS_MUSIC
+ usr.client.prefs.save_preferences()
+ if(usr.client.prefs.toggles & SOUND_BOSS_MUSIC)
+ to_chat(usr, "You will now hear Boss Musics.")
+ else
+ to_chat(usr, "You will no longer hear Boss Musics.")
+ usr.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ usr.stop_sound_channel(CHANNEL_BUZZ)
+ SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Boss Music", "[usr.client.prefs.toggles & SOUND_BOSS_MUSIC ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/datum/verbs/menu/Settings/Sound/Toggle_Soundscape/Get_checked(client/C)
+ return C.prefs.toggles & SOUND_BOSS_MUSIC
+//End of Sandstorm additions
TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)()
set name = "Hear/Silence Midis"
diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm
index 1de3a86702..b567a32a93 100644
--- a/code/modules/mining/equipment/regenerative_core.dm
+++ b/code/modules/mining/equipment/regenerative_core.dm
@@ -68,7 +68,7 @@
. = ..()
if(owner.health < owner.crit_threshold)
ui_action_click()
-
+/*
/obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(proximity_flag)
@@ -97,7 +97,7 @@
/obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target'
. = ..()
apply_healing_core(user, user)
-
+*/
/obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index e05391cfc5..b53fb2a52f 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -157,7 +157,8 @@
else // Skyrat Change
. += "[t_His] player has not allowed lewd verbs." // Skyrat Change
- . += "[src]'s Prefs :
ERP : [client.prefs.erppref] | Non-Con : [client.prefs.nonconpref] | Vore : [client.prefs.vorepref]
"
+ if(client && client.prefs) //what about a runtime for not having clients!
+ . += "[src]'s Prefs :
ERP : [client.prefs.erppref] | Non-Con : [client.prefs.nonconpref] | Vore : [client.prefs.vorepref]
"
var/list/missing = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/list/disabled = list()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 7009f13f36..06b7f44aa9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -72,7 +72,7 @@
target = null
return
return ..()
-
+/*
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
if(health > 0)
return
@@ -90,7 +90,7 @@
if(!elimination) //used so the achievment only occurs for the last legion to die.
grant_achievement(medal_type, score_type, crusher_kill)
..()
-
+*/
/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot()
loot = crusher_loot
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1102559aca..fd676d5ee5 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -350,7 +350,7 @@
return 1
/mob/living/simple_animal/proc/drop_loot()
- if(loot.len)
+ if(loot?.len)
for(var/i in loot)
new i(loc)
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 0c723199a1..1c4360d971 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -177,6 +177,7 @@
/obj/item/gun/energy/kinetic_accelerator/emp_act(severity)
return
+/* moved to sandcode
/obj/item/gun/energy/kinetic_accelerator/proc/reload()
cell.give(cell.maxcharge)
if(!suppressed)
@@ -185,7 +186,7 @@
to_chat(loc, "[src] silently charges up.")
update_icon()
overheat = FALSE
-
+*/
/obj/item/gun/energy/kinetic_accelerator/update_icon()
..()
if(!can_shoot())
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index d61f2a257b..487411d101 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -306,7 +306,7 @@ If you create T5+ please take a pass at gene_modder.dm [L40]. Max_values MUST fi
/obj/item/stock_parts/matter_bin/darkmatter
name = "dark-matter bin"
desc = "A container designed to hold compressed matter awaiting reconstruction."
- icon_state = "darkmatter_bin"
+ icon_state = "dark_matter_bin"
rating = 5
custom_materials = list(/datum/material/iron=80)
diff --git a/sandcode/code/__DEFINES/status_effects.dm b/sandcode/code/__DEFINES/status_effects.dm
new file mode 100644
index 0000000000..03e5e26394
--- /dev/null
+++ b/sandcode/code/__DEFINES/status_effects.dm
@@ -0,0 +1 @@
+#define STATUS_EFFECT_CRUSHERMARK_HARM /datum/status_effect/crusher_mark/harm
diff --git a/sandcode/code/datums/action.dm b/sandcode/code/datums/action.dm
new file mode 100644
index 0000000000..89774cec3b
--- /dev/null
+++ b/sandcode/code/datums/action.dm
@@ -0,0 +1,3 @@
+/datum/action/small_sprite/drake/akatosh
+ small_icon = 'sandcode/icons/mob/lavaland/drakeling_greyscale.dmi'
+ small_icon_state = "ash_whelp"
diff --git a/sandcode/code/datums/ruins/lavaland.dm b/sandcode/code/datums/ruins/lavaland.dm
new file mode 100644
index 0000000000..a8c992db89
--- /dev/null
+++ b/sandcode/code/datums/ruins/lavaland.dm
@@ -0,0 +1,33 @@
+/datum/map_template/ruin/lavaland/king_goat_boss
+ name = "King Goat Boss Ruin"
+ id = "kinggoatboss"
+ description = "Abandon All Hope Ye Who Enter Here."
+ suffix = "kinggoatboss.dmm"
+ always_place = TRUE
+ allow_duplicates = FALSE
+ cost = 0
+
+/datum/map_template/ruin/lavaland/sin/wrath
+ name = "Ruin of Wrath"
+ id = "wrathruin"
+ description = "RIP AND TEAR, UNTIL IT IS DONE."
+ suffix = "lavaland_surface_wrath.dmm"
+
+/datum/map_template/ruin/lavaland/rogue
+ name = "Rogue's Arena"
+ id = "roguearena"
+ description = "LOOK AT YOU HACKER."
+ suffix = "lavaland_surface_rogue.dmm"
+ cost = 0
+ always_place = TRUE
+ allow_duplicates = FALSE
+
+//always spawn sif's summoner sword
+/datum/map_template/ruin/lavaland/sif
+ name = "Sif's Sword"
+ id = "sif"
+ description = "A raised platform of rock leading to a giant sword in the ground. Weird..."
+ suffix = "lavaland_surface_sif_spawn.dmm"
+ always_place = TRUE
+ allow_duplicates = FALSE
+ cost = 0
diff --git a/sandcode/code/datums/status_effects/buffs.dm b/sandcode/code/datums/status_effects/buffs.dm
new file mode 100644
index 0000000000..8b081b0693
--- /dev/null
+++ b/sandcode/code/datums/status_effects/buffs.dm
@@ -0,0 +1,12 @@
+//argent
+/datum/status_effect/blooddrunk/argent
+ id = "argent"
+ duration = 100
+ tick_interval = 0
+ alert_type = /obj/screen/alert/status_effect/argent
+
+/obj/screen/alert/status_effect/argent
+ name = "Argent Energized"
+ desc = "Argent energy rushes through your body! You'll only take 10% damage for the duration of the energy rush!"
+ icon = 'sandcode/icons/mob/screen_alert.dmi'
+ icon_state = "argent"
diff --git a/sandcode/code/datums/status_effects/debuffs.dm b/sandcode/code/datums/status_effects/debuffs.dm
new file mode 100644
index 0000000000..8c3e61be25
--- /dev/null
+++ b/sandcode/code/datums/status_effects/debuffs.dm
@@ -0,0 +1,11 @@
+/datum/status_effect/crusher_mark/harm
+ id = "crusher_mark_harm"
+ duration = 100
+
+/datum/status_effect/crusher_mark/harm/on_apply()
+ . = ..()
+ marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2")
+ marked_underlay.pixel_x = -owner.pixel_x
+ marked_underlay.pixel_y = -owner.pixel_y
+ owner.underlays += marked_underlay
+ return TRUE
diff --git a/sandcode/code/game/area/areas/ruins/lavaland.dm b/sandcode/code/game/area/areas/ruins/lavaland.dm
new file mode 100644
index 0000000000..059fbdb8fb
--- /dev/null
+++ b/sandcode/code/game/area/areas/ruins/lavaland.dm
@@ -0,0 +1,10 @@
+/area/ruin/powered/kinggoat_arena
+ name = "King Goat Arena"
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+ noteleport = TRUE
+ icon_state = "dk_yellow"
+
+/area/lavaland/surface/sif
+ name = "Lavaland Sif Ruins"
+ icon_state = "red"
+ outdoors = TRUE
diff --git a/sandcode/code/game/objects/items/plushes/plushes.dm b/sandcode/code/game/objects/items/plushes/plushes.dm
new file mode 100644
index 0000000000..2800964d1c
--- /dev/null
+++ b/sandcode/code/game/objects/items/plushes/plushes.dm
@@ -0,0 +1,134 @@
+//i hate these fucking goats but i can't murder them, for i know they will haunt me in my sleep if i do so. so i nerf them instead.
+/obj/item/toy/plush/goatplushie
+ name = "strange goat plushie"
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ icon_state = "goat"
+ desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same. Goats never change."
+
+/obj/item/toy/plush/goatplushie/angry
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ var/mob/living/carbon/target
+ throwforce = 5
+ var/cooldown = 0
+ var/cooldown_modifier = 20
+
+/obj/item/toy/plush/goatplushie/angry/Initialize()
+ . = ..()
+ START_PROCESSING(SSprocessing, src)
+
+/obj/item/toy/plush/goatplushie/angry/process()
+ if (prob(25) && !target)
+ var/list/targets_to_pick_from = list()
+ for(var/mob/living/carbon/C in view(7, src))
+ if(considered_alive(C.mind) && !faction_check(list("goat"), C.faction, FALSE))
+ targets_to_pick_from += C
+ if (!targets_to_pick_from.len)
+ return
+ target = pick(targets_to_pick_from)
+ visible_message("[src] stares at [target].")
+ if (world.time > cooldown && target)
+ ram()
+
+/obj/item/toy/plush/goatplushie/angry/proc/ram()
+ if(prob((obj_flags & EMAGGED) ? 98:90) && isturf(loc) && considered_alive(target.mind) && !faction_check(list("goat"), target.faction, FALSE))
+ throw_at(target, 10, 10)
+ visible_message("[src] rams [target]!")
+ cooldown = world.time + cooldown_modifier
+ target = null
+ visible_message("[src] looks disinterested.")
+
+/obj/item/toy/plush/goatplushie/angry/emag_act(mob/user)
+ if (obj_flags&EMAGGED)
+ visible_message("[src] already looks angry enough, you shouldn't anger it more.")
+ return
+ cooldown_modifier = cooldown_modifier/2 * 0.75
+ throwforce = 12.5
+ force = 10
+ obj_flags |= EMAGGED
+ visible_message("[src] stares at [user] angrily before going docile.")
+
+/obj/item/toy/plush/goatplushie/angry/Destroy()
+ STOP_PROCESSING(SSprocessing, src)
+ return ..()
+
+/obj/item/toy/plush/goatplushie
+ squeak_override = list('sandcode/sound/items/goatsound.ogg'=1)
+
+/obj/item/toy/plush/goatplushie/angry/realgoat
+ name = "goat plushie"
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ icon_state = "realgoat"
+
+/obj/item/toy/plush/realgoat
+ name = "goat plushie"
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same... or at least it would if it wasn't a normal plushie."
+ icon_state = "realgoat"
+ squeak_override = list('sandcode/sound/items/goatsound.ogg'=1)
+
+/obj/item/toy/plush/goatplushie/angry/kinggoat
+ name = "King Goat Plushie"
+ desc = "A plushie depicting the king of all goats."
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ icon_state = "kinggoat"
+ throwforce = 8
+ force = 8
+ attack_verb = list("chomped")
+ gender = MALE
+
+/obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat
+ name = "Ascended King Goat Plushie"
+ desc = "A plushie depicting the god of all goats."
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ icon_state = "ascendedkinggoat"
+ throwforce = 10
+ force = 10
+ var/divine = TRUE
+
+/obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat/attackby(obj/item/I,mob/living/user,params)
+ if(I.get_sharpness())
+ user.visible_message("[user] attempts to destroy [src]!", "[I] bounces off [src]'s back before breaking into millions of pieces... [src] glares at [user]!") // You fucked up now son
+ I.play_tool_sound(src)
+ qdel(I)
+ user.gib()
+
+/obj/item/toy/plush/goatplushie/angry/kinggoat/attackby(obj/item/I,mob/living/user,params)
+ if(I.get_sharpness())
+ user.visible_message("[user] rips [src] to shreds!", "[src]'s death has attracted the attention of the king goat plushie guards!")
+ I.play_tool_sound(src)
+ qdel(src)
+ var/turf/location = get_turf(user)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ new/obj/item/toy/plush/goatplushie/angry/guardgoat(location)
+ if(istype(I, /obj/item/reagent_containers/food/snacks/grown/cabbage))
+ user.visible_message("[user] watches as [src] takes a bite out of the cabbage!", "[src]'s fur starts glowing. It seems they have ascended!")
+ playsound(src, 'sound/items/eatfood.ogg', 50, 1)
+ qdel(I)
+ qdel(src)
+ var/turf/location = get_turf(user)
+ new/obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat(location)
+
+
+/obj/item/toy/plush/goatplushie/angry/guardgoat
+ name = "guard goat plushie"
+ desc = "A plushie depicting one of the King Goat's guards, tasked to protect the king at all costs."
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ icon_state = "guardgoat"
+ throwforce = 6
+
+/obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat
+ name = "royal guard goat plushie"
+ desc = "A plushie depicting one of the royal King Goat's guards, tasked to protecting the king at all costs and training new goat guards."
+ icon = 'sandcode/icons/obj/plushes.dmi'
+ icon_state = "royalguardgoat"
+ throwforce = 7
diff --git a/sandcode/code/game/objects/structures/ladders.dm b/sandcode/code/game/objects/structures/ladders.dm
new file mode 100644
index 0000000000..f2be4151de
--- /dev/null
+++ b/sandcode/code/game/objects/structures/ladders.dm
@@ -0,0 +1,9 @@
+/obj/structure/ladder/unbreakable/kinggoat
+ name = "Ladder to King Goat's arena"
+ id = "kinggoat"
+ height = 0
+
+/obj/structure/ladder/unbreakable/kinggoat/goat2
+ name = "Ladder out of King Goat's arena"
+ id = "kinggoat"
+ height = 1
diff --git a/sandcode/code/game/objects/structures/lavaland/necropolis_tendril.dm b/sandcode/code/game/objects/structures/lavaland/necropolis_tendril.dm
new file mode 100644
index 0000000000..a08c43d930
--- /dev/null
+++ b/sandcode/code/game/objects/structures/lavaland/necropolis_tendril.dm
@@ -0,0 +1,8 @@
+/obj/structure/spawner/lavaland/shamblingminer
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/miner)
+
+/obj/structure/spawner/lavaland/icewatcher
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing)
+
+/obj/structure/spawner/lavaland/imp
+ mob_types = list(/mob/living/simple_animal/hostile/asteroid/imp)
diff --git a/sandcode/code/game/turfs/simulated/floor/asteroid.dm b/sandcode/code/game/turfs/simulated/floor/asteroid.dm
new file mode 100644
index 0000000000..2d0c6cc4ae
--- /dev/null
+++ b/sandcode/code/game/turfs/simulated/floor/asteroid.dm
@@ -0,0 +1,105 @@
+#define SPAWN_MEGAFAUNA "bluh bluh huge boss"
+#define SPAWN_BUBBLEGUM 6
+
+//This list prevents spawning more than the associated amount
+//of megafauna.
+GLOBAL_LIST_INIT(cap_megas,\
+ list(/mob/living/simple_animal/hostile/megafauna/dragon = 3,\
+ /mob/living/simple_animal/hostile/megafauna/colossus = 3,\
+ /mob/living/simple_animal/hostile/megafauna/bubblegum = 3))
+
+//this is probably a horrendous way to do it
+//forgive me for my sins
+//this is basically a list of all the turfs that
+//attempted to spawn a monster/tendril in lavaland
+GLOBAL_LIST_INIT(spawned_turfs, list())
+
+//this list counts all the turfs that successfuly spawned
+//a monster or tendril
+GLOBAL_LIST_INIT(success_spawned_turfs, list())
+
+/turf/open/floor/plating/asteroid/airless/cave/volcanic
+ mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \
+ /mob/living/simple_animal/hostile/asteroid/miner = 40, /obj/structure/spawner/lavaland/shamblingminer = 2, \
+ /mob/living/simple_animal/hostile/asteroid/imp = 20, /obj/structure/spawner/lavaland/imp = 1, \
+ SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
+ //imps are rare because boy they annoying
+
+/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
+ if(!isarea(loc))
+ return
+ var/area/A = loc
+ GLOB.spawned_turfs += src
+ if(prob(30))
+ if(!A.mob_spawn_allowed)
+ return
+ var/randumb = pickweight(mob_spawn_list)
+ if(!randumb)
+ return
+ while(randumb == SPAWN_MEGAFAUNA)
+ if(A.megafauna_spawn_allowed && megafauna_spawn_list && megafauna_spawn_list.len) //this is danger. it's boss time.
+ var/maybe_boss = pickweight(megafauna_spawn_list)
+ if(megafauna_spawn_list[maybe_boss])
+ var/count = get_mega_count(maybe_boss)
+ if(count < GLOB.cap_megas[maybe_boss])
+ randumb = maybe_boss
+ else
+ randumb = pickweight(mob_spawn_list)
+ else //this is not danger, don't spawn a boss, spawn something else
+ randumb = pickweight(mob_spawn_list)
+
+ for(var/mob/living/simple_animal/hostile/H in urange(12,T)) //prevents mob clumps
+ if((ispath(randumb, /mob/living/simple_animal/hostile/megafauna) || ismegafauna(H)) && get_dist(src, H) <= 7)
+ return //if there's a megafauna within standard view don't spawn anything at all
+ if(ispath(randumb, /mob/living/simple_animal/hostile/asteroid) || istype(H, /mob/living/simple_animal/hostile/asteroid))
+ return //if the random is a standard mob, avoid spawning if there's another one within 12 tiles
+ if(ispath(randumb, /obj/structure/spawner/lavaland))
+ for(var/obj/structure/spawner/lavaland/L in urange(12,T))
+ return //prevents tendrils spawning in each other's collapse range
+
+ new randumb(T)
+ GLOB.success_spawned_turfs += src
+ return TRUE
+
+/turf/open/floor/plating/asteroid/airless/cave/proc/BruteForceSpawn(var/mob/living/simple_animal/hostile/megafauna/boss)
+ if(!isarea(loc))
+ return FALSE
+ var/area/A = loc
+ if(!A.mob_spawn_allowed)
+ return FALSE
+ if(!boss || !istype(boss))
+ return FALSE
+ if(A.megafauna_spawn_allowed && megafauna_spawn_list && megafauna_spawn_list.len) //this is danger. it's boss time.
+ if(get_mega_count(boss) < GLOB.cap_megas[boss])
+ new boss()
+ return TRUE
+ return FALSE
+
+/turf/open/floor/plating/asteroid/airless/cave/proc/BruteForceTendril(var/obj/structure/spawner/lavaland/tend)
+ if(!isarea(loc))
+ return FALSE
+ var/area/A = loc
+ if(!A.mob_spawn_allowed)
+ return FALSE
+ if(!tend || !istype(tend))
+ return FALSE
+ if(get_tendril_count(tend) < 1)
+ new tend()
+ return TRUE
+ return FALSE
+
+/proc/get_mega_count(var/mob/living/simple_animal/hostile/megafauna/maybe_boss)
+ var/count = 0
+ for(var/mob/living/simple_animal/hostile/megafauna/M in GLOB.mob_living_list)
+ if(istype(M, maybe_boss))
+ count++
+ return count
+
+/proc/get_tendril_count(var/obj/structure/spawner/lavaland/meme)
+ var/count = 0
+ for(var/obj/structure/spawner/lavaland/T in GLOB.tendrils)
+ if(istype(T, meme))
+ count++
+ return count
diff --git a/sandcode/code/modules/clothing/head/misc.dm b/sandcode/code/modules/clothing/head/misc.dm
new file mode 100644
index 0000000000..116218fb64
--- /dev/null
+++ b/sandcode/code/modules/clothing/head/misc.dm
@@ -0,0 +1,51 @@
+/obj/item/clothing/head/goatpelt
+ name = "goat pelt hat"
+ desc = "Fuzzy and Warm!"
+ icon = 'sandcode/icons/obj/clothing/hats.dmi'
+ icon_state = "goatpelt"
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
+ item_state = "goatpelt"
+
+/obj/item/clothing/head/goatpelt/king
+ name = "king goat pelt hat"
+ desc = "Fuzzy, Warm and Robust!"
+ icon_state = "goatpelt"
+ item_state = "goatpelt"
+ color = "#ffd700"
+ body_parts_covered = HEAD
+ armor = list("melee" = 60, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 20, "rad" = 20, "fire" = 100, "acid" = 100)
+ dog_fashion = null
+ resistance_flags = FIRE_PROOF
+
+/obj/item/clothing/head/goatpelt/king/equipped(mob/living/carbon/human/user, slot)
+ ..()
+ if (slot == ITEM_SLOT_HEAD)
+ user.faction |= "goat"
+
+/obj/item/clothing/head/goatpelt/king/dropped(mob/living/carbon/human/user)
+ if (user.head == src)
+ user.faction -= "goat"
+ ..()
+
+/obj/item/clothing/head/goatpope
+ name = "goat pope hat"
+ desc = "And on the seventh day King Goat said there will be cabbage!"
+ mob_overlay_icon = 'sandcode/icons/mob/large-worn-icons/64x64/head.dmi'
+ mutantrace_variation = STYLE_NO_ANTHRO_ICON
+ icon = 'sandcode/icons/obj/clothing/hats.dmi'
+ icon_state = "goatpope"
+ item_state = "goatpope"
+ worn_x_dimension = 64
+ worn_y_dimension = 64
+ resistance_flags = FLAMMABLE
+
+/obj/item/clothing/head/goatpope/equipped(mob/living/carbon/human/user, slot)
+ ..()
+ if (slot == ITEM_SLOT_HEAD)
+ user.faction |= "goat"
+
+/obj/item/clothing/head/goatpope/dropped(mob/living/carbon/human/user, slot)
+ if (user.head == src)
+ user.faction -= "goat"
+ ..()
diff --git a/sandcode/code/modules/language/dragon.dm b/sandcode/code/modules/language/dragon.dm
new file mode 100644
index 0000000000..1231ba8b86
--- /dev/null
+++ b/sandcode/code/modules/language/dragon.dm
@@ -0,0 +1,7 @@
+/datum/language_holder/dragon
+ understood_languages = list(/datum/language/common = list(LANGUAGE_MIND),
+ /datum/language/draconic = list(LANGUAGE_MIND),
+ /datum/language/dwarf = list(LANGUAGE_MIND))
+ spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM),
+ /datum/language/draconic = list(LANGUAGE_ATOM),
+ /datum/language/dwarf = list(LANGUAGE_ATOM))
diff --git a/sandcode/code/modules/mining/equipment/kinetic_crusher.dm b/sandcode/code/modules/mining/equipment/kinetic_crusher.dm
new file mode 100644
index 0000000000..ab34ac328c
--- /dev/null
+++ b/sandcode/code/modules/mining/equipment/kinetic_crusher.dm
@@ -0,0 +1,462 @@
+//kinetic destroyer (premium crusher)
+/obj/item/kinetic_crusher/premiumcrusher
+ icon = 'sandcode/icons/obj/mining.dmi'
+ lefthand_file = 'sandcode/icons/mob/inhands/weapons/hammerspc_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/weapons/hammerspc_righthand.dmi'
+ name = "Kinetic Destroyer"
+ desc = "Revised and refined by veteran miners, this crusher design has been improved in nearly everyway. Featuring a lightweight composite body and a hardened plastitanium head, this weapon is exceptional at removing life from most things."
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ armour_penetration = 15
+ detonation_damage = 60
+ backstab_bonus = 40
+
+//legion (the big one!)
+/obj/item/crusher_trophy/golden_skull
+ name = "golden legion skull"
+ desc = "Nope, it's not the crystal one, but still valuable. Suitable as a trophy for a kinetic crusher."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "goldenskull"
+ denied_type = /obj/item/crusher_trophy/golden_skull
+
+/obj/item/crusher_trophy/golden_skull/effect_desc()
+ return "a kinetic crusher to make dead animals into friendly fauna, as well as turning corpses into legions, if the user is on grab intent"
+
+/obj/item/crusher_trophy/golden_skull/on_mark_detonation(mob/living/target, mob/living/user)
+ if(target.stat == DEAD)
+ if(istype(target, /mob/living/simple_animal/hostile/asteroid) && user.a_intent == INTENT_GRAB)
+ var/mob/living/simple_animal/hostile/asteroid/L = target
+ L.revive(full_heal = 1, admin_revive = 1)
+ L.attack_same = 0
+ L.loot = null
+ L.crusher_loot = null
+ L.faction = user.faction.Copy()
+ user.visible_message("[user] revives [target] with [src], as a friendly fauna")
+ playsound(src,'sound/effects/supermatter.ogg',50,1)
+
+/obj/item/crusher_trophy/golden_skull/on_melee_hit(mob/living/target, mob/living/user)
+ var/obj/item/kinetic_crusher/K = loc
+ var/is_wielded = TRUE
+ if(istype(K))
+ var/datum/component/two_handed/TH = K.GetComponent(/datum/component/two_handed)
+ is_wielded = TH.wielded
+ else
+ user.is_holding_item_of_type(/obj/item/melee/zweihander)
+ if(ishuman(target) && (target.stat == DEAD) && (is_wielded) && user.a_intent == INTENT_GRAB)
+ var/confirm = input("Are you sure you want to turn [target] into a friendly legion?", "Legionification") in list("Yes", "No")
+ if(confirm == "Yes")
+ var/mob/living/carbon/human/H = target
+ var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(H.loc)
+ L.stored_mob = H
+ H.forceMove(L)
+ L.faction = user.faction.Copy()
+ L.revive(full_heal = 1, admin_revive = 1)
+ L.attack_same = 0
+ L.loot = null
+ L.crusher_loot = null
+ user.visible_message("[user] revives [target] with [src], as a friendly legion.")
+ playsound(src,'sound/effects/supermatter.ogg',50,1)
+ else
+ (to_chat(user, "You cancel turning [target] into a legion."))
+
+//rogue process
+/obj/item/crusher_trophy/brokentech
+ name = "broken AI"
+ desc = "It used to control a mecha, now it's just trash. Suitable as a trophy for a kinetic crusher."
+ denied_type = /obj/item/crusher_trophy/brokentech
+ icon = 'icons/obj/aicards.dmi'
+ icon_state = "pai"
+ var/range = 4
+ var/cooldowntime = 50
+ var/cooldown = 0
+
+/obj/item/crusher_trophy/brokentech/effect_desc()
+ return "your kinetic crusher to create shockwaves when fired."
+
+/obj/item/crusher_trophy/brokentech/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
+ . = ..()
+ if(cooldowntime < world.time)
+ INVOKE_ASYNC(src, .proc/invokesmoke, user)
+
+/obj/item/crusher_trophy/brokentech/proc/invokesmoke(mob/living/user)
+ cooldown = world.time + cooldowntime
+ var/list/hit_things = list()
+ var/turf/T = get_turf(get_step(user, user.dir))
+ var/ogdir = user.dir
+ for(var/i = 0, i < src.range, i++)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/L in T.contents)
+ if(L != user && !(L in hit_things) && !ishuman(L))
+ if(!faction_check(user.faction, L.faction))
+ if(prob(25))
+ L.Stun(10)
+ L.apply_damage_type(20, BRUTE)
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled(user)
+ T = get_step(T, ogdir)
+ sleep(2)
+
+//shambling miner
+/obj/item/crusher_trophy/blaster_tubes/mask
+ name = "mask of a shambling miner"
+ desc = "It really doesn't seem like it could be worn. Suitable as a crusher trophy."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "miner_mask"
+ bonus_value = 10
+ denied_type = /obj/item/crusher_trophy/blaster_tubes/mask
+
+/obj/item/crusher_trophy/blaster_tubes/mask/effect_desc()
+ return "the crusher to deal [bonus_value] extra melee damage"
+
+/obj/item/crusher_trophy/blaster_tubes/mask/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
+ if(deadly_shot)
+ marker.name = "kinetic [marker.name]"
+ marker.icon_state = "ka_tracer"
+ marker.damage = bonus_value
+ marker.nodamage = FALSE
+ deadly_shot = FALSE
+
+/obj/item/crusher_trophy/blaster_tubes/mask/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark)
+ new /obj/effect/temp_visual/kinetic_blast(target)
+ playsound(target.loc, 'sound/weapons/kenetic_accel.ogg', 60, 0)
+
+/obj/item/crusher_trophy/blaster_tubes/mask/add_to(obj/item/kinetic_crusher/H, mob/living/user)
+ . = ..()
+ H.force += bonus_value
+
+/obj/item/crusher_trophy/blaster_tubes/mask/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
+ . = ..()
+ H.force -= bonus_value
+
+//lava imp
+/obj/item/crusher_trophy/blaster_tubes/impskull
+ name = "imp skull"
+ desc = "Somebody got glory killed. Suitable as a trophy."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "impskull"
+ bonus_value = 5
+ denied_type = /obj/item/crusher_trophy/blaster_tubes/impskull
+
+/obj/item/crusher_trophy/blaster_tubes/impskull/effect_desc()
+ return "causes every marker to deal [bonus_value] damage."
+
+/obj/item/crusher_trophy/blaster_tubes/impskull/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
+ marker.name = "fiery [marker.name]"
+ marker.icon_state = "fireball"
+ marker.damage = bonus_value
+ marker.nodamage = FALSE
+ playsound(user.loc, 'sandcode/sound/misc/impranged.wav', 50, 0)
+
+//traitor crusher
+/obj/item/projectile/destabilizer/harm
+ name = "harmful destabilzing force"
+ range = 10
+
+/obj/item/projectile/destabilizer/harm/on_hit(atom/target, blocked = FALSE)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK_HARM)) //used as a boolean
+ var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK_HARM, hammer_synced)
+ if(hammer_synced)
+ for(var/t in hammer_synced.trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.on_mark_application(target, CM, had_effect)
+ var/target_turf = get_turf(target)
+ if(ismineralturf(target_turf))
+ var/turf/closed/mineral/M = target_turf
+ new /obj/effect/temp_visual/kinetic_blast(M)
+ M.gets_drilled(firer)
+ ..()
+
+/obj/item/kinetic_crusher/harm
+ desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \
+ While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna. Something's very odd about this one, however..."
+
+/obj/item/kinetic_crusher/harm/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
+ if(istype(target, /obj/item/crusher_trophy))
+ var/obj/item/crusher_trophy/T = target
+ T.add_to(src, user)
+ if(!wielded)
+ return
+ if(!proximity_flag && charged)//Mark a target, or mine a tile.
+ var/turf/proj_turf = user.loc
+ if(!isturf(proj_turf))
+ return
+ var/obj/item/projectile/destabilizer/harm/D = new /obj/item/projectile/destabilizer/harm(proj_turf)
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.on_projectile_fire(D, user)
+ D.preparePixelProjectile(target, user, clickparams)
+ D.firer = user
+ D.hammer_synced = src
+ playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
+ D.fire()
+ charged = FALSE
+ update_icon()
+ addtimer(CALLBACK(src, .proc/Recharge), charge_time)
+ return
+ if(proximity_flag && isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK_HARM)
+ if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK_HARM))
+ return
+ var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ var/target_health = L.health
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.on_mark_detonation(target, user)
+ if(!QDELETED(L))
+ if(!QDELETED(C))
+ C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
+ var/backstab_dir = get_dir(user, L)
+ var/def_check = L.getarmor(type = "bomb")
+ if((user.dir & backstab_dir) && (L.dir & backstab_dir))
+ if(!QDELETED(C))
+ C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item
+ L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check)
+ playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
+ else
+ if(!QDELETED(C))
+ C.total_damage += detonation_damage
+ L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
+
+ if(user && lavaland_equipment_pressure_check(get_turf(user))) //CIT CHANGE - makes sure below only happens in low pressure environments
+ user.adjustStaminaLoss(-30)//CIT CHANGE - makes crushers heal stamina
+ SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, clickparams)
+ SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, clickparams)
+
+//king goat
+/obj/item/crusher_trophy/king_goat
+ name = "king goat hoof"
+ desc = "A hoof from the king of all goats, it still glows with a fraction of its original power... Suitable as a trophy for a kinetic crusher."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "goat_hoof" //needs a better sprite but I cant sprite .
+ denied_type = /obj/item/crusher_trophy/king_goat
+
+/obj/item/crusher_trophy/king_goat/effect_desc()
+ return "you also passively recharge markers 5x as fast while equipped and do a decent amount of damage at the cost of dulling the blade"
+
+/obj/item/crusher_trophy/king_goat/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
+ marker.damage = 10 //in my testing only does damage to simple mobs so should be fine to have it high
+
+/obj/item/crusher_trophy/king_goat/add_to(obj/item/kinetic_crusher/H, mob/living/user)
+ . = ..()
+ if(.)
+ var/datum/component/two_handed/TH = H.GetComponent(/datum/component/two_handed)
+ H.charge_time -= 12
+ TH.force_wielded -= 15
+
+/obj/item/crusher_trophy/king_goat/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
+ . = ..()
+ if(.)
+ var/datum/component/two_handed/TH = H.GetComponent(/datum/component/two_handed)
+ H.charge_time += 15
+ TH.force_wielded += 12
+
+//hierophant crusher small changes
+/obj/item/crusher_trophy/vortex_talisman
+ var/cdmultiplier = 1.25
+
+/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user)
+ if(vortex_cd >= world.time)
+ return
+ var/turf/T = get_turf(user)
+ var/obj/effect/temp_visual/hierophant/wall/crusher/wall = new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass!
+ var/turf/otherT = get_step(T, turn(user.dir, 90))
+ if(otherT)
+ new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
+ otherT = get_step(T, turn(user.dir, -90))
+ if(otherT)
+ new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user)
+ vortex_cd = world.time + (wall.duration * cdmultiplier)
+
+//gladiator
+/obj/item/crusher_trophy/gladiator
+ name = "gladiator's horn"
+ desc = "The remaining horn of the Gladiator. Suitable as a crusher trophy."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "horn"
+ bonus_value = 15
+ denied_type = /obj/item/crusher_trophy/gladiator
+
+/obj/item/crusher_trophy/gladiator/effect_desc()
+ return "the crusher to have a [bonus_value]% chance to block any incoming attack."
+
+/obj/item/crusher_trophy/gladiator/add_to(obj/item/kinetic_crusher/H, mob/living/user)
+ . = ..()
+ if(.)
+ H.block_chance += bonus_value
+
+/obj/item/crusher_trophy/gladiator/remove_from(obj/item/kinetic_crusher/H, mob/living/user)
+ . = ..()
+ if(.)
+ H.block_chance -= bonus_value
+
+//gladiator zweihander - it's just a one handed crusher
+/obj/item/melee/zweihander
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "zweihander"
+ item_state = "zweihander"
+ resistance_flags = FIRE_PROOF | UNACIDABLE | INDESTRUCTIBLE
+ lefthand_file = 'sandcode/icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/weapons/swords_righthand.dmi'
+ name = "Zweihander"
+ desc = "A surprisingly tough sword, made out of drake hide and bone. Somehow, despite it's large size, it's easy to carry one handed."
+ force = 15
+ w_class = WEIGHT_CLASS_BULKY
+ throwforce = 15
+ throw_speed = 4
+ armour_penetration = 20
+ custom_materials = list(/datum/material/titanium=3150, /datum/material/glass=2075, /datum/material/gold=3000, /datum/material/diamond=5000)
+ hitsound = 'sandcode/sound/weapons/zweihanderslice.ogg'
+ attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped")
+ sharpness = IS_SHARP
+ var/list/trophies = list()
+ var/charged = TRUE
+ var/charge_time = 12
+ var/detonation_damage = 65
+ var/backstab_bonus = 40
+ var/brightness = 7
+
+/obj/item/melee/zweihander/Initialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 80, 110)
+ set_light(brightness)
+
+/obj/item/melee/zweihander/Destroy()
+ QDEL_LIST(trophies)
+ return ..()
+
+/obj/item/melee/zweihander/examine(mob/living/user)
+ . = ..()
+ . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage."
+ . += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]."
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ . += "It has \a [T] attached, which causes [T.effect_desc()]."
+
+/obj/item/melee/zweihander/attackby(obj/item/I, mob/living/user)
+ if(istype(I, /obj/item/crowbar))
+ if(LAZYLEN(trophies))
+ to_chat(user, "You remove [src]'s trophies.")
+ I.play_tool_sound(src)
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.remove_from(src, user)
+ else
+ to_chat(user, "There are no trophies on [src].")
+ else if(istype(I, /obj/item/crusher_trophy))
+ var/obj/item/crusher_trophy/T = I
+ T.add_to(src, user)
+ else
+ return ..()
+
+/obj/item/melee/zweihander/attack(mob/living/target, mob/living/carbon/user)
+ var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ var/target_health = target.health
+ ..()
+ for(var/t in trophies)
+ if(!QDELETED(target))
+ var/obj/item/crusher_trophy/T = t
+ T.on_melee_hit(target, user)
+ if(!QDELETED(C) && !QDELETED(target))
+ C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did
+
+/obj/item/melee/zweihander/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
+ . = ..()
+ if(istype(target, /obj/item/crusher_trophy))
+ var/obj/item/crusher_trophy/T = target
+ T.add_to(src, user)
+ if(!proximity_flag && charged)//Mark a target, or mine a tile.
+ var/turf/proj_turf = user.loc
+ if(!isturf(proj_turf))
+ return
+ var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.on_projectile_fire(D, user)
+ D.preparePixelProjectile(target, user, clickparams)
+ D.firer = user
+ D.hammer_synced = src
+ playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1)
+ D.fire()
+ charged = FALSE
+ update_icon()
+ addtimer(CALLBACK(src, .proc/Recharge), charge_time)
+ return
+ if(proximity_flag && isliving(target))
+ var/mob/living/L = target
+ var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)
+ if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK))
+ return
+ var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ var/target_health = L.health
+ for(var/t in trophies)
+ var/obj/item/crusher_trophy/T = t
+ T.on_mark_detonation(target, user)
+ if(!QDELETED(L))
+ if(!QDELETED(C))
+ C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did
+ new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
+ var/backstab_dir = get_dir(user, L)
+ var/def_check = L.getarmor(type = "bomb")
+ if((user.dir & backstab_dir) && (L.dir & backstab_dir))
+ if(!QDELETED(C))
+ C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item
+ L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check)
+ playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong
+ else
+ if(!QDELETED(C))
+ C.total_damage += detonation_damage
+ L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
+
+ if(user && lavaland_equipment_pressure_check(get_turf(user))) //CIT CHANGE - makes sure below only happens in low pressure environments
+ user.adjustStaminaLoss(-30)//CIT CHANGE - makes crushers heal stamina
+
+/obj/item/melee/zweihander/proc/Recharge()
+ if(!charged)
+ charged = TRUE
+ update_icon()
+ playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+
+//great brown wolf sif
+/obj/item/crusher_trophy/dark_energy
+ name = "dark energy"
+ desc = "A black ball of energy that was formed when Sif miraculously imploded. Suitable as a trophy for a kinetic crusher."
+ icon = 'sandcode/icons/obj/lavaland/sif.dmi'
+ icon_state = "sif_energy"
+ denied_type = /obj/item/crusher_trophy/dark_energy
+ bonus_value = 30
+ var/range = 3
+
+/obj/item/crusher_trophy/dark_energy/effect_desc()
+ return "mark detonation to perform a bash dealing [bonus_value] - dashing through the target if possible"
+
+/obj/item/crusher_trophy/dark_energy/on_mark_detonation(mob/living/target, mob/living/user)
+ if(!target || !user)
+ return
+ var/chargeturf = get_turf(target) //get target turf
+ if(!chargeturf)
+ return
+ var/dir = get_dir(user, chargeturf)//get direction
+ var/turf/T = get_ranged_target_turf(chargeturf,dir,range)//get final dash turf
+ if(!T) //the final dash turf was out of range - we settle for the target turf instead
+ T = chargeturf
+ playsound(user, pick('sandcode/sound/sif/whoosh1.ogg', 'sandcode/sound/sif/whoosh2.ogg', 'sandcode/sound/sif/whoosh3.ogg'), 300, 1)
+ new /obj/effect/temp_visual/decoy/fading(user.loc, user)
+ //Stop movement
+ walk(user,0)
+ setDir(dir)
+ var/movespeed = 0.7
+ //Apply damage
+ target.apply_damage(bonus_value, BRUTE)
+ playsound(user, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1)
+ //Dash through the target if possible (it was a furious bash after all)
+ if(target.CanPass(user, T))
+ walk_to(user, T, 0, 1, movespeed)
+ playsound(user, pick('sandcode/sound/sif/whoosh1.ogg', 'sandcode/sound/sif/whoosh2.ogg', 'sandcode/sound/sif/whoosh3.ogg'), 300, 1)
+ new /obj/effect/temp_visual/decoy/fading(user.loc, user)
+ //Stop movement
+ walk(user, 0)
+
diff --git a/sandcode/code/modules/mining/equipment/regenerative_core.dm b/sandcode/code/modules/mining/equipment/regenerative_core.dm
new file mode 100644
index 0000000000..ae17447321
--- /dev/null
+++ b/sandcode/code/modules/mining/equipment/regenerative_core.dm
@@ -0,0 +1,49 @@
+/obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag)
+ if(proximity_flag)
+ if(ishuman(target))
+ apply_healing_core(target, user)
+ else if(istype(target, /mob/living/simple_animal/hostile/megafauna/bubblegum))
+ new /mob/living/simple_animal/hostile/megafauna/bubblegum/hard(target.loc)
+ visible_message("[user] turned [target] into an enraged [target]!")
+ qdel(target)
+ qdel(src)
+ else if(istype(target, /mob/living/simple_animal/hostile/megafauna/dragon))
+ new /mob/living/simple_animal/hostile/megafauna/dragon/hard(target.loc)
+ visible_message("[user] turned [target] into an enraged [target]!")
+ qdel(target)
+ qdel(src)
+ else if(istype(target, /mob/living/simple_animal/hostile/megafauna/legion))
+ new /mob/living/simple_animal/hostile/megafauna/legion/hard(target.loc)
+ visible_message("[user] turned [target] into an enraged [target]!")
+ qdel(target)
+ qdel(src)
+
+/obj/item/organ/regenerative_core/attack_self(mob/user)
+ if(iscarbon(user))
+ apply_healing_core(user, user)
+
+/obj/item/organ/regenerative_core/proc/apply_healing_core(atom/target, mob/user)
+ if(!user || !ishuman(target))
+ return
+ var/mob/living/carbon/human/H = target
+ if(inert)
+ to_chat(user, "[src] has decayed and can no longer be used to heal.")
+ return
+ if(H.stat == DEAD)
+ to_chat(user, "[src] are useless on the dead.")
+ return
+ if(H != user)
+ 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. 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"))
+ if(is_station_level(H.z))
+ H.adjustBruteLoss(-25, 0)
+ H.adjustFireLoss(-25, 0)
+ for(var/obj/item/organ/O in H)
+ O.damage = 0
+ else
+ H.revive(full_heal = 1)
+ qdel(src)
+ user.log_message("[user] used [src] to heal [H == user ? "[H.p_them()]self" : H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another.
diff --git a/sandcode/code/modules/mining/lavaland/necropolis_chests.dm b/sandcode/code/modules/mining/lavaland/necropolis_chests.dm
new file mode 100644
index 0000000000..a09e17bab1
--- /dev/null
+++ b/sandcode/code/modules/mining/lavaland/necropolis_chests.dm
@@ -0,0 +1,1141 @@
+//boss chests
+//gladiator
+/obj/structure/closet/crate/necropolis/gladiator
+ name = "gladiator chest"
+
+/obj/structure/closet/crate/necropolis/gladiator/crusher
+ name = "dreadful gladiator chest"
+
+/obj/structure/closet/crate/necropolis/gladiator/PopulateContents()
+ new /obj/item/shield/riot/tower/swat/gladiator(src)
+ new /obj/item/borg/upgrade/modkit/shielding(src)
+
+/obj/structure/closet/crate/necropolis/gladiator/crusher/PopulateContents()
+ new /obj/item/shield/riot/tower/swat/gladiator(src)
+ new /obj/item/melee/zweihander(src)
+ new /obj/item/crusher_trophy/gladiator(src)
+
+/obj/item/shield/riot/tower/swat/gladiator
+ name = "\proper Gladiator's shield"
+ desc = "A very powerful and near indestructible shield, reinforced with drake and goliath hide. Can be used as a raft on lava."
+ icon = 'sandcode/icons/obj/shields.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/equipment/shields_righthand.dmi'
+ lefthand_file = 'sandcode/icons/mob/inhands/equipment/shields_lefthand.dmi'
+ icon_state = "gladiator"
+ item_state = "gladiator"
+ resistance_flags = FIRE_PROOF | UNACIDABLE | INDESTRUCTIBLE
+ shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_BASH_ALWAYS_DISARM | SHIELD_BASH_GROUND_SLAM_DISARM
+ slowdown = 0
+ shieldbash_cooldown = 6 SECONDS
+ shieldbash_stamcost = 5
+ shieldbash_knockback = 2
+ shieldbash_brutedamage = 10
+ shieldbash_stamdmg = 25
+ shieldbash_stagger_duration = 4.5 SECONDS
+ shieldbash_push_distance = 2
+ max_integrity = 350
+ block_chance = 50
+ can_shatter = FALSE
+ repair_material = /obj/item/stack/sheet/animalhide/goliath_hide
+ w_class = WEIGHT_CLASS_BULKY
+
+/obj/item/shield/riot/tower/swat/gladiator/AltClick(mob/user)
+ if(isliving(user))
+ if(do_after(user, 20, target = src))
+ new /obj/vehicle/ridden/lavaboat/dragon/gladiator(get_turf(user))
+ qdel(src)
+
+/obj/vehicle/ridden/lavaboat/dragon/gladiator
+ name = "\proper Gladiator's surfboard"
+ desc = "This thing can be used to cross lava rivers... I guess. Alt click to turn into back into a shield."
+ icon = 'sandcode/icons/obj/shields.dmi'
+ icon_state = "raft"
+
+/obj/vehicle/ridden/lavaboat/dragon/gladiator/Initialize()
+ ..()
+ var/datum/component/riding/D = LoadComponent(/datum/component/riding)
+ D.vehicle_move_delay = 1
+ D.allowed_turf_typecache = typecacheof(/turf/open) //thanks Bob for telling me it was on purpose
+ D.keytype = null
+
+/obj/vehicle/ridden/lavaboat/dragon/gladiator/AltClick(mob/user)
+ ..()
+ if(isliving(user))
+ if(do_after(user, 20, target = src))
+ new /obj/item/shield/riot/tower/swat/gladiator(get_turf(user))
+ qdel(src)
+
+//bubblegum
+/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
+ new /obj/item/clothing/suit/space/hostile_environment(src)
+ new /obj/item/clothing/head/helmet/space/hostile_environment(src)
+ new /obj/item/borg/upgrade/modkit/shotgun(src)
+ new /obj/item/gun/magic/staff/spellblade(src)
+
+/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents()
+ new /obj/item/clothing/suit/space/hostile_environment(src)
+ new /obj/item/clothing/head/helmet/space/hostile_environment(src)
+ new /obj/item/crusher_trophy/demon_claws(src)
+ new /obj/item/gun/magic/staff/spellblade(src)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard
+ name = "enraged bubblegum chest"
+
+/obj/structure/closet/crate/necropolis/bubblegum/hard/PopulateContents()
+ new /obj/item/crucible(src)
+ new /obj/item/gun/ballistic/revolver/doublebarrel/super(src)
+ new /obj/item/clothing/suit/space/hardsuit/deathsquad/praetor(src)
+ new /obj/item/borg/upgrade/modkit/shotgun(src)
+
+/obj/structure/closet/crate/necropolis/bubblegum/hard/crusher
+ name = "enraged bloody bubblegum chest"
+
+/obj/structure/closet/crate/necropolis/bubblegum/hard/crusher/PopulateContents()
+ new /obj/item/crucible(src)
+ new /obj/item/gun/ballistic/revolver/doublebarrel/super(src)
+ new /obj/item/clothing/suit/space/hardsuit/deathsquad/praetor(src)
+ new /obj/item/crusher_trophy/demon_claws(src)
+
+//super shotty changes (meat hook instead of bursto)
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super
+ burst_size = 1
+ actions_types = list(/datum/action/item_action/toggle_hook)
+ icon = 'sandcode/icons/obj/guns/projectile.dmi'
+ icon_state = "heckgun"
+ lefthand_file = 'sandcode/icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/weapons/guns_righthand.dmi'
+ item_state = "heckgun"
+ sharpness = IS_SHARP
+ force = 15
+ var/recharge_rate = 4
+ var/charge_tick = 0
+ var/toggled = FALSE
+ var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/Initialize()
+ . = ..()
+ if(!alternate_magazine)
+ alternate_magazine = new /obj/item/ammo_box/magazine/internal/shot/dual/heck/hook(src)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/attack_self(mob/living/user)
+ if(toggled)
+ return 0
+ else
+ ..()
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/process()
+ if(toggled)
+ charge_tick++
+ if(charge_tick < recharge_rate)
+ return 0
+ charge_tick = 0
+ chambered.newshot()
+ return 1
+ else
+ ..()
+
+/obj/item/ammo_box/magazine/internal/shot/dual/heck/hook
+ name = "hookshot internal magazine"
+ max_ammo = 1
+ ammo_type = /obj/item/ammo_casing/magic/hook/heck
+
+/obj/item/ammo_casing/magic/hook/heck
+ projectile_type = /obj/item/projectile/heckhook
+
+/obj/item/projectile/heckhook //had to create a separate, non-child projectile because otherwise there would be conflicts when calling parent procs.
+ name = "hook"
+ icon_state = "hook"
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ pass_flags = PASSTABLE
+ damage = 10
+ armour_penetration = 100
+ damage_type = BRUTE
+ hitsound = 'sound/effects/splat.ogg'
+ knockdown = 0
+ var/chain
+
+/obj/item/projectile/heckhook/fire(setAngle)
+ if(firer)
+ chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
+ ..()
+
+/obj/item/projectile/heckhook/on_hit(atom/target)
+ . = ..()
+ var/atom/A = target
+ A.visible_message("[A] is snagged by [firer]'s hook!")
+ new /datum/forced_movement(firer, get_turf(A), 1, TRUE)
+
+/obj/item/projectile/heckhook/Destroy()
+ qdel(chain)
+ return ..()
+
+/datum/action/item_action/toggle_hook
+ name = "Toggle Hook"
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/toggle_hook))
+ toggle_hook(user)
+ else
+ ..()
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/proc/toggle_hook(mob/living/user)
+ var/current_mag = magazine
+ var/alt_mag = alternate_magazine
+ magazine = alt_mag
+ alternate_magazine = current_mag
+ toggled = !toggled
+ if(toggled)
+ to_chat(user, "You will now fire a hookshot.")
+ else
+ to_chat(user, "You will now fire normal shotgun rounds.")
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/sawoff(mob/user)
+ to_chat(user, "Why would you mutilate this work of art?")
+ return
+
+/obj/item/gun/ballistic/revolver/doublebarrel/super/upgraded
+ desc = "It was fearsome before, now it's even worse with an internal system that makes it fire both barrels at once."
+ burst_size = 2
+ burst_shot_delay = 1
+
+//crucible
+/obj/item/crucible
+ name = "Crucible Sword"
+ desc = "Made from pure argent energy, this sword can cut through flesh like butter."
+ icon = 'sandcode/icons/obj/1x2.dmi'
+ icon_state = "crucible0"
+ var/icon_state_on = "crucible1"
+ lefthand_file = 'sandcode/icons/mob/inhands/weapons/crucible_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/weapons/crucible_righthand.dmi'
+ item_state = "crucible0"
+ force = 3
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_NORMAL
+ var/w_class_on = WEIGHT_CLASS_HUGE
+ hitsound = "swing_hit"
+ var/hitsound_on = 'sound/weapons/bladeslice.ogg'
+ armour_penetration = 50
+ light_color = "#ff0000"//BLOOD RED
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 0
+ var/block_chance_on = 50
+ max_integrity = 400
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF
+ var/brightness_on = 6
+ total_mass = 1
+ var/total_mass_on = TOTAL_MASS_MEDIEVAL_WEAPON
+ var/wielded
+ var/item_state_on = "crucible1"
+
+/obj/item/crucible/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/wield)
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/unwield)
+
+/obj/item/crucible/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=25, icon_wielded="crucible1", wieldsound = 'sound/weapons/saberon.ogg', unwieldsound = 'sound/weapons/saberoff.ogg')
+
+/obj/item/crucible/suicide_act(mob/living/carbon/user)
+ if(wielded)
+ user.visible_message("[user] DOOMs themselves with the [src]!")
+
+ var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
+ var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
+ B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
+ var/randdir
+ for(var/i in 1 to 24)//like a headless chicken!
+ if(user.is_holding(src))
+ randdir = pick(GLOB.alldirs)
+ user.Move(get_step(user, randdir),randdir)
+ user.emote("spin")
+ if (i == 3 && myhead)
+ myhead.drop_limb()
+ sleep(3)
+ else
+ user.visible_message("[user] panics and starts choking to death!")
+ return OXYLOSS
+
+
+ else
+ user.visible_message("[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!")
+ return BRUTELOSS
+
+/obj/item/crucible/update_icon_state()
+ if(wielded)
+ icon_state = "crucible[wielded]"
+ else
+ icon_state = "crucible0"
+ clean_blood()
+
+/obj/item/crucible/attack(mob/target, mob/living/carbon/human/user)
+ var/def_zone = user.zone_selected
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(H.getarmor(def_zone, "melee") < 35)
+ if((user.zone_selected != BODY_ZONE_CHEST) && (user.zone_selected != BODY_ZONE_HEAD) && (user.zone_selected != BODY_ZONE_PRECISE_GROIN))
+ ..()
+ var/obj/item/bodypart/bodyp= H.get_bodypart(def_zone)
+ bodyp.dismember()
+ else
+ ..()
+ else if(user.zone_selected == BODY_ZONE_CHEST && H.health <= 0)
+ ..()
+ H.spill_organs()
+ else if(user.zone_selected == BODY_ZONE_HEAD && H.health <= 0)
+ ..()
+ var/obj/item/bodypart/bodyp= H.get_bodypart(def_zone)
+ bodyp.drop_limb()
+ else
+ ..()
+ else
+ ..()
+
+/obj/item/crucible/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ if(!wielded)
+ return BLOCK_NONE
+ return ..()
+
+/obj/item/crucible/proc/wield(mob/living/carbon/M)
+ wielded = TRUE
+ sharpness = IS_SHARP
+ w_class = w_class_on
+ total_mass = total_mass_on
+ hitsound = hitsound_on
+ item_state = item_state_on
+ block_chance = block_chance_on
+ START_PROCESSING(SSobj, src)
+ set_light(brightness_on)
+ AddElement(/datum/element/sword_point)
+
+/obj/item/crucible/proc/unwield()
+ wielded = FALSE
+ sharpness = initial(sharpness)
+ w_class = initial(w_class)
+ total_mass = initial(total_mass)
+ hitsound = "swing_hit"
+ block_chance = initial(block_chance)
+ item_state = initial(item_state)
+ STOP_PROCESSING(SSobj, src)
+ set_light(0)
+ RemoveElement(/datum/element/sword_point)
+
+/obj/item/crucible/process()
+ if(wielded)
+ open_flame()
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/crucible/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ if(!wielded)
+ return BLOCK_NONE
+ return ..()
+
+/obj/item/crucible/ignition_effect(atom/A, mob/user)
+ if(!wielded)
+ return FALSE
+ var/in_mouth = ""
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.wear_mask)
+ in_mouth = ", barely missing [user.p_their()] nose"
+ . = "[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process."
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ add_fingerprint(user)
+
+//praetor suit and helmet
+/obj/item/clothing/suit/space/hardsuit/deathsquad/praetor
+ name = "Praetor Suit"
+ desc = "And those that tasted the bite of his sword named him... The Doom Slayer."
+ armor = list("melee" = 75, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ strip_delay = 130
+ icon = 'sandcode/icons/obj/clothing/suits.dmi'
+ icon_state = "praetor"
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/suit.dmi'
+ anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/suit_digi.dmi'
+ item_state = "praetor"
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad/praetor
+ slowdown = 0
+ mutantrace_variation = STYLE_DIGITIGRADE | STYLE_NO_ANTHRO_ICON
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+
+/obj/item/clothing/head/helmet/space/hardsuit/deathsquad/praetor
+ name = "Praetor Suit helmet"
+ desc = "That's one doomed space marine."
+ armor = list("melee" = 75, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ strip_delay = 130
+ icon = 'sandcode/icons/obj/clothing/hats.dmi'
+ icon_state = "praetor"
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/head.dmi'
+ anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/head_muzzled.dmi'
+ mutantrace_variation = STYLE_MUZZLE | STYLE_NO_ANTHRO_ICON
+ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+
+//drake
+/obj/structure/closet/crate/necropolis/dragon/PopulateContents()
+ new /obj/item/borg/upgrade/modkit/knockback(src)
+ var/loot = rand(1,4)
+ switch(loot)
+ if(1)
+ new /obj/item/melee/ghost_sword(src)
+ if(2)
+ new /obj/item/lava_staff(src)
+ if(3)
+ new /obj/item/book/granter/spell/sacredflame(src)
+ new /obj/item/gun/magic/wand/fireball(src)
+ if(4)
+ new /obj/item/dragons_blood(src)
+
+/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents()
+ new /obj/item/crusher_trophy/tail_spike(src)
+ var/loot = rand(1,4)
+ switch(loot)
+ if(1)
+ new /obj/item/melee/ghost_sword(src)
+ if(2)
+ new /obj/item/lava_staff(src)
+ if(3)
+ new /obj/item/book/granter/spell/sacredflame(src)
+ new /obj/item/gun/magic/wand/fireball(src)
+ if(4)
+ new /obj/item/dragons_blood(src)
+
+/obj/structure/closet/crate/necropolis/dragon/hard
+ name = "enraged dragon chest"
+
+/obj/structure/closet/crate/necropolis/dragon/hard/PopulateContents()
+ new /obj/item/melee/ghost_sword(src)
+ new /obj/item/lava_staff(src)
+ new /obj/item/book/granter/spell/sacredflame(src)
+ new /obj/item/gun/magic/wand/fireball(src)
+ new /obj/item/borg/upgrade/modkit/knockback(src)
+ new /obj/item/dragons_blood(src)
+ new /obj/item/clothing/neck/necklace/memento_mori/king(src)
+
+/obj/structure/closet/crate/necropolis/dragon/hard/crusher
+ name = "enraged fiery dragon chest"
+
+/obj/structure/closet/crate/necropolis/dragon/hard/crusher/PopulateContents()
+ new /obj/item/melee/ghost_sword(src)
+ new /obj/item/lava_staff(src)
+ new /obj/item/book/granter/spell/sacredflame(src)
+ new /obj/item/gun/magic/wand/fireball(src)
+ new /obj/item/dragons_blood(src)
+ new /obj/item/clothing/neck/necklace/memento_mori/king(src)
+ new /obj/item/crusher_trophy/tail_spike(src)
+
+//ghost sword buff because it is dogshit
+/obj/item/melee/ghost_sword
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
+ . = ..()
+ force = 0
+ throwforce = 0
+ armour_penetration = 0
+ var/ghost_counter = ghost_check()
+ force = clamp((ghost_counter * 2.5), 15, 25)
+ throwforce = clamp((ghost_counter * 2), 5, 18)
+ armour_penetration = clamp((ghost_counter * 3), 0, 35)
+ sharpness = IS_BLUNT
+ if(ghost_counter >= 4)
+ sharpness = IS_SHARP_ACCURATE
+ user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!")
+
+/obj/item/melee/ghost_sword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ var/ghost_counter = ghost_check()
+ final_block_chance = clamp((ghost_counter * 5), 10, 50)
+ owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!")
+ return ..()
+
+/obj/item/clothing/neck/necklace/memento_mori/king
+ name = "amulet of kings"
+ desc = "An amulet that shows everyone who the true emperor is."
+ icon = 'sandcode/icons/obj/clothing/neck.dmi'
+ icon_state = "dragon_amulet"
+ item_state = "dragon_amulet"
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/neck.dmi'
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+
+//colossus
+/obj/structure/closet/crate/necropolis/colossus/PopulateContents()
+ new /obj/item/bluecrystal(src)
+ new /obj/item/organ/vocal_cords/colossus(src)
+ new /obj/item/borg/upgrade/modkit/bolter(src)
+
+/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents()
+ new /obj/item/bluecrystal(src)
+ new /obj/item/organ/vocal_cords/colossus(src)
+ new /obj/item/crusher_trophy/blaster_tubes(src)
+
+//crystal choosing thing from colosssus
+/obj/item/bluecrystal
+ name = "\improper blue crystal"
+ desc = "It's very shiny... one may wonder what it does."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "bluecrystal"
+ w_class = WEIGHT_CLASS_SMALL
+ var/list/choices = list(
+ "Clown" = /obj/machinery/anomalous_crystal/honk,
+ "Theme Warp" = /obj/machinery/anomalous_crystal/theme_warp,
+ "Bolter" = /obj/machinery/anomalous_crystal/emitter,
+ "Dark Revival" = /obj/machinery/anomalous_crystal/dark_reprise,
+ "Lightgeist Healers" = /obj/machinery/anomalous_crystal/helpers,
+ "Refresher" = /obj/machinery/anomalous_crystal/refresher,
+ "Possessor" = /obj/machinery/anomalous_crystal/possessor
+ )
+ var/list/methods = list(
+ "touch",
+ "speech",
+ "heat",
+ "bullet",
+ "energy",
+ "bomb",
+ "bumping",
+ "weapon",
+ "magic"
+ )
+
+/obj/item/bluecrystal/attack_self(mob/user)
+ var/choice = input(user, "Choose your destiny", "Crystal") as null|anything in choices
+ var/method = input(user, "Choose your activation method", "Crystal") as null|anything in methods
+ if(!choice || !method)
+ return
+ playsound(user.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE)
+ var/choosey = choices[choice]
+ var/obj/machinery/anomalous_crystal/A = new choosey(user.loc)
+ A.activation_method = method
+ to_chat(user, "[A] appears under your feet as the [src] breaks apart!")
+ qdel(src)
+
+//normal chests
+/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
+ var/loot = rand(1,34)
+ new /obj/item/stock_parts/cell/high/plus/argent(src)
+ switch(loot)
+ if(1)
+ new /obj/item/shared_storage/red(src)
+ return list(/obj/item/shared_storage/red)
+ if(2)
+ new /obj/item/clothing/suit/space/hardsuit/cult(src)
+ return list(/obj/item/clothing/suit/space/hardsuit/cult)
+ if(3)
+ new /obj/item/soulstone/anybody(src)
+ return list(/obj/item/soulstone/anybody)
+ if(4)
+ new /obj/item/katana/cursed(src)
+ return list(/obj/item/katana/cursed)
+ if(5)
+ new /obj/item/clothing/glasses/godeye(src)
+ return list(/obj/item/clothing/glasses/godeye)
+ if(6)
+ new /obj/item/reagent_containers/glass/bottle/potion/flight(src)
+ return list(/obj/item/reagent_containers/glass/bottle/potion/flight)
+ if(7)
+ new /obj/item/pickaxe/diamond(src)
+ return list(/obj/item/pickaxe/diamond)
+ if(8)
+ if(prob(50))
+ new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src)
+ return list(/obj/item/disk/design_disk/modkit_disc/resonator_blast)
+ else
+ new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
+ return list(/obj/item/disk/design_disk/modkit_disc/rapid_repeater)
+ if(9)
+ new /obj/item/rod_of_asclepius(src)
+ return list(/obj/item/rod_of_asclepius)
+ if(10)
+ new /obj/item/organ/heart/cursed/wizard(src)
+ return list(/obj/item/organ/heart/cursed/wizard)
+ if(11)
+ new /obj/item/ship_in_a_bottle(src)
+ return list(/obj/item/ship_in_a_bottle)
+ if(12)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/damaged(src)
+ return list(/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker)
+ if(13)
+ new /obj/item/jacobs_ladder(src)
+ return list(/obj/item/jacobs_ladder)
+ if(14)
+ new /obj/item/nullrod/scythe/talking(src)
+ return list(/obj/item/nullrod/scythe/talking)
+ if(15)
+ new /obj/item/nullrod/armblade(src)
+ return list(/obj/item/nullrod/armblade)
+ if(16)
+ new /obj/item/guardiancreator(src)
+ return list(/obj/item/guardiancreator)
+ if(17)
+ if(prob(50))
+ new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
+ return list(/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe)
+ else
+ new /obj/item/disk/design_disk/modkit_disc/bounty(src)
+ return list(/obj/item/disk/design_disk/modkit_disc/bounty)
+ if(18)
+ new /obj/item/warp_cube/red(src)
+ return list(/obj/item/warp_cube/red)
+ if(19)
+ new /obj/item/wisp_lantern(src)
+ return list(/obj/item/wisp_lantern)
+ if(20)
+ new /obj/item/immortality_talisman(src)
+ return list(/obj/item/immortality_talisman)
+ if(21)
+ new /obj/item/gun/magic/hook(src)
+ return list(/obj/item/gun/magic/hook)
+ if(22)
+ new /obj/item/voodoo(src)
+ return list(/obj/item/voodoo)
+ if(23)
+ new /obj/item/grenade/clusterbuster/inferno(src)
+ return list(/obj/item/grenade/clusterbuster/inferno)
+ if(24)
+ new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/damaged(src)
+ return list(/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor, /obj/item/reagent_containers/food/drinks/bottle/holywater/hell)
+ if(25)
+ new /obj/item/book/granter/spell/summonitem(src)
+ return list(/obj/item/book/granter/spell/summonitem)
+ if(26)
+ new /obj/item/book_of_babel(src)
+ return list(/obj/item/book_of_babel)
+ if(27)
+ new /obj/item/borg/upgrade/modkit/lifesteal(src)
+ new /obj/item/bedsheet/cult(src)
+ return list(/obj/item/borg/upgrade/modkit/lifesteal, /obj/item/bedsheet/cult)
+ if(28)
+ new /obj/item/clothing/neck/necklace/memento_mori(src)
+ return list(/obj/item/clothing/neck/necklace/memento_mori)
+ if(29)
+ new /obj/item/gun/magic/staff/door(src)
+ return list(/obj/item/gun/magic/staff/door)
+ if(30)
+ new /obj/item/katana/necropolis(src)
+ return list(/obj/item/katana/necropolis)
+ if(31)
+ new /obj/item/gun/ballistic/shotgun/boltaction(src)
+ return list(/obj/item/gun/ballistic/shotgun/boltaction)
+ if(32)
+ new /obj/item/gun/magic/staff/locker/trashy
+ return list(/obj/item/gun/magic/staff/locker)
+ if(33)
+ new /obj/item/clothing/accessory/fireresist(src)
+ return list(/obj/item/clothing/accessory/fireresist)
+ if(34)
+ new /obj/item/clothing/accessory/lavawalk(src)
+ return list(/obj/item/clothing/accessory/lavawalk)
+
+/obj/item/gun/magic/staff/locker/trashy
+ max_charges = 1
+ recharge_rate = 150 //should take a literal 5 minutes to recharge a single shot
+
+/obj/item/clothing/accessory/fireresist
+ name = "fire resistance medal"
+ desc = "A golden medal. Capable of making any jumpsuit able to withstand fire."
+ icon_state = "gold"
+ var/stored_name = ""
+ var/stored_desc = ""
+ var/stored_resistance_flags = 0
+ var/stored_heat_protection = 0
+ var/stored_max_heat_protection_temperature = 0
+
+/obj/item/clothing/accessory/fireresist/attach(obj/item/clothing/under/U, user)
+ . = ..()
+ stored_name = U.name
+ stored_desc = U.desc
+ stored_resistance_flags = U.resistance_flags
+ stored_max_heat_protection_temperature = U.max_heat_protection_temperature
+ stored_heat_protection = U.heat_protection
+ U.name = "fireproofed " + U.name
+ U.desc += " It has been fireproofed with [src]."
+ U.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+ U.heat_protection = FULL_BODY
+ U.resistance_flags |= FIRE_PROOF
+
+/obj/item/clothing/accessory/fireresist/detach(obj/item/clothing/under/U, user)
+ . = ..()
+ U.name = stored_name
+ U.desc = stored_desc
+ U.max_heat_protection_temperature = stored_max_heat_protection_temperature
+ U.heat_protection = stored_heat_protection
+ U.resistance_flags = stored_resistance_flags
+
+/obj/item/clothing/accessory/lavawalk
+ name = "lava walking medal"
+ desc = "A golden medal. Capable of making any jumpsuit completely lava proof for a brief window of time."
+ icon_state = "gold"
+ actions_types = list(/datum/action/item_action/lavawalk)
+ var/cool_down = 0
+ var/cooldown_time = 1200 //two full minutes
+ var/effectduration = 100 //10 seconds of lava walking
+ var/storedimmunities = list()
+
+/obj/item/clothing/accessory/lavawalk/on_uniform_equip(obj/item/clothing/under/U, user)
+ . = ..()
+ var/mob/living/L = U.loc
+ if(L && istype(L))
+ for(var/datum/action/A in actions_types)
+ A.Grant(L)
+
+/obj/item/clothing/accessory/lavawalk/on_uniform_dropped(obj/item/clothing/under/U, user)
+ . = ..()
+ var/mob/living/L = U.loc
+ if(L && istype(L))
+ for(var/datum/action/A in actions_types)
+ A.Remove(L)
+
+/datum/action/item_action/lavawalk
+ name = "Lava Walk"
+ desc = "Become immune to lava for a brief period of time."
+
+/obj/item/clothing/accessory/lavawalk/ui_action_click(mob/user, actiontype)
+ if(istype(actiontype, /datum/action/item_action/lavawalk))
+ if(world.time >= cool_down)
+ var/mob/living/L = user
+ if(istype(L))
+ storedimmunities = L.weather_immunities.Copy()
+ L.weather_immunities |= list("ash", "lava")
+ cool_down = world.time + cooldown_time
+ addtimer(CALLBACK(src, .proc/reset_user, L), effectduration)
+
+/obj/item/clothing/accessory/lavawalk/proc/reset_user(mob/living/user)
+ user.weather_immunities = storedimmunities
+ storedimmunities = list()
+
+//Nerfing those on the chest because too OP yada yada
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/damaged
+ name = "damaged inquisitor's hardsuit"
+ desc = "It's not really in good shape, but still serves decent protection."
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/damaged
+ clothing_flags = THICKMATERIAL // no space protection
+ armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/damaged
+ name = "damaged inquisitor's hardsuit helmet"
+ clothing_flags = THICKMATERIAL // no space protection
+ armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
+
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/damaged
+ name = "damaged berserker's hardsuit"
+ desc = "It's not really in good shape, but still serves decent protection."
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/damaged
+ clothing_flags = THICKMATERIAL // no space protection
+ armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/damaged
+ name = "damaged berserker's hardsuit helmet"
+ clothing_flags = THICKMATERIAL // no space protection
+ armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
+
+/obj/item/stock_parts/cell/high/plus/argent
+ name = "Argent Energy Cell"
+ desc = "Harvested from the necropolis, this autocharging energy cell can be crushed to provide a temporary 90% damage reduction bonus. Also useful for research."
+ self_recharge = 1
+ maxcharge = 1500 //only barely better than a normal power cell now
+ chargerate = 700 //good recharge time doe
+ icon = 'sandcode/icons/obj/items_and_weapons.dmi'
+ icon_state = "argentcell"
+ ratingdesc = FALSE
+ rating = 6
+ custom_materials = list(/datum/material/glass=500, /datum/material/uranium=250, /datum/material/plasma=1000, /datum/material/diamond=500)
+ var/datum/status_effect/onuse = /datum/status_effect/blooddrunk/argent
+
+/obj/item/stock_parts/cell/high/plus/argent/attack_self(mob/user)
+ ..()
+ user.visible_message("[user] crushes the [src] in his hands, absorbing it's energy!")
+ playsound(user.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE)
+ var/mob/living/M = user
+ M.apply_status_effect(onuse)
+ qdel(src)
+
+/obj/item/stock_parts/cell/high/plus/argent/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/empprotection, EMP_PROTECT_SELF)
+
+/obj/item/katana/necropolis
+ force = 25 //Wouldn't want a miner walking around with a 40 damage melee around now, would we?
+ armour_penetration = 33
+ block_chance = 0 //blocky bad
+
+/obj/item/immortality_talisman
+ w_class = WEIGHT_CLASS_SMALL //why the fuck are they large anyways
+
+//legion
+/obj/structure/closet/crate/necropolis/tendril/legion_loot
+ name = "screeching legion crate"
+
+/obj/structure/closet/crate/necropolis/tendril/legion_loot/PopulateContents()
+ var/obj/structure/closet/crate/necropolis/tendril/N = new /obj/structure/closet/crate/necropolis/tendril()
+ var/list/weedeater = N.PopulateContents()
+ for(var/loot in weedeater)
+ new loot(src)
+ qdel(N)
+
+/obj/structure/closet/crate/necropolis/legion
+ name = "echoing legion crate"
+
+/obj/structure/closet/crate/necropolis/legion/PopulateContents()
+ new /obj/item/staff/storm(src)
+ new /obj/item/crusher_trophy/golden_skull(src)
+ new /obj/item/borg/upgrade/modkit/skull(src)
+
+/obj/structure/closet/crate/necropolis/legion/hard
+ name = "enraged echoing legion crate"
+
+/obj/structure/closet/crate/necropolis/legion/hard/PopulateContents()
+ new /obj/item/staff/storm(src)
+ new /obj/item/clothing/mask/gas/dagoth(src)
+ new /obj/item/crusher_trophy/golden_skull(src)
+ new /obj/item/borg/upgrade/modkit/skull(src)
+ var/obj/structure/closet/crate/necropolis/tendril/T = new /obj/structure/closet/crate/necropolis/tendril //Yup, i know, VERY spaghetti code.
+ var/obj/item/L
+ for(var/i = 0, i < 3, i++)
+ L = T.PopulateContents()
+ for(var/loot in L)
+ new loot(src)
+ qdel(T)
+
+//dagoth ur mask
+/obj/item/clothing/mask/gas/dagoth
+ name = "Golden Mask"
+ desc = "Such a grand and intoxicating innocence."
+ icon = 'sandcode/icons/obj/clothing/masks.dmi'
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/mask.dmi'
+ anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/head_muzzled.dmi'
+ icon_state = "dagoth"
+ item_state = "dagoth"
+ actions_types = list(/datum/action/item_action/ashstorm)
+ flash_protect = 2
+ armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)//HOW CAN YOU KILL A GOD?
+ var/static/list/excluded_areas = list(/area/reebe/city_of_cogs)
+ var/storm_type = /datum/weather/ash_storm
+ var/storm_cooldown = 0
+ w_class = WEIGHT_CLASS_BULKY //its a fucking full metal mask man
+ mutantrace_variation = STYLE_MUZZLE | STYLE_NO_ANTHRO_ICON
+
+/datum/action/item_action/ashstorm
+ name = "Summon Ash Storm"
+ desc = "Bring the wrath of the sixth house upon the area where you stand."
+
+/obj/item/clothing/mask/gas/dagoth/ui_action_click(mob/user, action)
+ if(istype(action, /datum/action/item_action/ashstorm))
+ if(storm_cooldown > world.time)
+ to_chat(user, "The [src] is still recharging!")
+ return
+
+ var/area/user_area = get_base_area(user)
+ var/turf/user_turf = get_turf(user)
+ if(!user_area || !user_turf || (user_area.type in excluded_areas))
+ to_chat(user, "Something is preventing you from using the [src] here.")
+ return
+ var/datum/weather/A
+ for(var/V in SSweather.processing)
+ var/datum/weather/W = V
+ if((user_turf.z in W.impacted_z_levels) && W.area_type == user_area.type)
+ A = W
+ break
+
+ if(A)
+ if(A.stage != END_STAGE)
+ if(A.stage == WIND_DOWN_STAGE)
+ to_chat(user, "The storm is already ending! It would be a waste to use the [src] now.")
+ return
+ user.visible_message("[user] gazes into the sky with [src], seemingly repelling the current storm!", \
+ "You gaze intently skyward, dispelling the storm!")
+ playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
+ A.wind_down()
+ log_game("[user] ([key_name(user)]) has dispelled a storm at [AREACOORD(user_turf)]")
+ return
+ else
+ A = new storm_type(list(user_turf.z))
+ A.name = "staff storm"
+ log_game("[user] ([key_name(user)]) has summoned [A] at [AREACOORD(user_turf)]")
+ if (is_special_character(user))
+ message_admins("[A] has been summoned in [ADMIN_VERBOSEJMP(user_turf)] by [user] ([key_name_admin(user)], a non-antagonist")
+ A.area_type = user_area.type
+ A.telegraph_duration = 100
+ A.end_duration = 100
+
+ user.visible_message("[user] gazes skyward with his [src], terrible red lightning strikes seem to accompany them!", \
+ "You gaze skyward with [src], calling down a terrible storm!")
+ playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
+ A.telegraph()
+ storm_cooldown = world.time + 200
+ else
+ ..()
+
+//glaurung (needs unique loot and crusher trophy)
+/obj/structure/closet/crate/necropolis/glaurung
+ name = "drake chest"
+
+/obj/structure/closet/crate/necropolis/glaurung/PopulateContents()
+ new /obj/item/borg/upgrade/modkit/knockback(src)
+ var/loot = rand(1,4)
+ switch(loot)
+ if(1)
+ new /obj/item/melee/ghost_sword(src)
+ if(2)
+ new /obj/item/lava_staff(src)
+ if(3)
+ new /obj/item/book/granter/spell/sacredflame(src)
+ new /obj/item/gun/magic/wand/fireball(src)
+ if(4)
+ new /obj/item/dragons_blood(src)
+
+/obj/structure/closet/crate/necropolis/glaurung/crusher
+ name = "wise drake chest"
+
+/obj/structure/closet/crate/necropolis/glaurung/crusher/PopulateContents()
+ new /obj/item/crusher_trophy/tail_spike(src)
+ var/loot = rand(1,4)
+ switch(loot)
+ if(1)
+ new /obj/item/melee/ghost_sword(src)
+ if(2)
+ new /obj/item/lava_staff(src)
+ if(3)
+ new /obj/item/book/granter/spell/sacredflame(src)
+ new /obj/item/gun/magic/wand/fireball(src)
+ if(4)
+ new /obj/item/dragons_blood(src)
+
+//Sif stuff
+//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Sword Of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
+
+/*Videos on what the sword can do:
+**
+**Attacking: ---------- https://bungdeep.com/Sif/Sword_of_the_Forsaken_Attack.mp4
+**Butchering: --------- https://bungdeep.com/Sif/Sword_of_the_Forsaken_Butcher.mp4
+**Dodging: ------------ https://bungdeep.com/Sif/Sword_of_the_Forsaken_Block_Melee.png
+**Projectile Dodging: - https://bungdeep.com/Sif/Sword_of_the_Forsaken_Block.png
+**
+*/
+/obj/item/melee/sword_of_the_forsaken
+ name = "Sword of the Forsaken"
+ desc = "A glowing giant heavy blade that grows and slightly shrinks in size depending on the wielder's strength."
+ icon = 'sandcode/icons/obj/lavaland/sif.dmi'
+ icon_state = "sword_of_the_forsaken"
+ item_state = "sword_of_the_forsaken"
+ lefthand_file = 'sandcode/icons/mob/inhands/item_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/item_righthand.dmi'
+ w_class = WEIGHT_CLASS_HUGE
+ force = 20 //slight buff because 15 just doesn't cut it for megafauna loot... hehe "cut it"
+ throwforce = 10
+ block_chance = 20 //again, slight buff
+ armour_penetration = 200 //the armor penetration is really what makes this unique and actually worth it so boomp it
+ hitsound = 'sandcode/sound/sif/sif_slash.ogg'
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "gutted", "gored")
+ sharpness = IS_SHARP
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+//Enables the sword to butcher bodies
+/obj/item/melee/sword_of_the_forsaken/Initialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 50, 100, 10)
+
+//Sword blocking attacks, really hard to block projectiles but still possible.
+/obj/item/melee/sword_of_the_forsaken/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
+ if(attack_type == ATTACK_TYPE_PROJECTILE)
+ final_block_chance = 10 //half as much what you get in melee
+ return ..()
+
+//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=End of Sworf Of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
+
+
+//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Necklace Of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
+
+/*Videos on what the necklace can do:
+**
+**Binding the necklace to yourself: ------- https://bungdeep.com/Sif/Necklace_of_the_Forsaken_Binding.mp4
+**Reviving when died: --------------------- https://bungdeep.com/Sif/Necklace_of_the_Forsaken_Death_Revive.mp4
+**Becomes a cosmetic item after it is used: https://bungdeep.com/Sif/Necklace_of_the_Forsaken_Revive_Used.png
+**
+*/
+/obj/item/clothing/neck/necklace/necklace_of_the_forsaken
+ name = "Necklace of the Forsaken"
+ desc = "A rose gold necklace with a small static ember that burns inside of the black gem stone, making it warm to the touch."
+ icon = 'sandcode/icons/obj/lavaland/sif.dmi'
+ icon_state = "necklace_forsaken_active"
+ actions_types = list(/datum/action/item_action/hands_free/necklace_of_the_forsaken)
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ var/mob/living/carbon/human/active_owner
+ var/numUses = 1
+
+/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/item_action_slot_check(slot)
+ return (..() && (slot == SLOT_NECK))
+
+/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/dropped(mob/user)
+ ..()
+ if(active_owner)
+ remove_necklace()
+
+//Apply a temp buff until the necklace is used
+/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/temp_buff(mob/living/carbon/human/user)
+ to_chat(user, "You feel as if you have a second chance at something, but you're not sure what.")
+ if(do_after(user, 40, target = user))
+ to_chat(user, "The ember warms you...")
+ ADD_TRAIT(user, TRAIT_NOHARDCRIT, "necklace_of_the_forsaken")//less chance of being gibbed
+ active_owner = user
+
+//Revive the user and remove buffs
+/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/second_chance()
+ icon_state = "necklace_forsaken_active"
+ if(!active_owner)
+ return
+ var/mob/living/carbon/human/H = active_owner
+ active_owner = null
+ to_chat(H, "You feel a scorching burn fill your body and limbs!")
+ H.revive(TRUE, FALSE)
+ remove_necklace() //remove buffs
+
+//Remove buffs
+/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/remove_necklace()
+ icon_state = "necklace_forsaken_active"
+ if(!active_owner)
+ return
+ REMOVE_TRAIT(active_owner, TRAIT_NOHARDCRIT, "necklace_of_the_forsaken")
+ active_owner = null //just in case
+
+//Add action
+/datum/action/item_action/hands_free/necklace_of_the_forsaken
+ check_flags = NONE
+ name = "Necklace of the Forsaken"
+ desc = "Bind the necklaces ember to yourself, so that next time you activate it, it will revive or fully heal you whether dead or knocked out. (Beware of being gibbed)"
+
+//What happens when the user clicks on datum
+/datum/action/item_action/hands_free/necklace_of_the_forsaken/Trigger()
+ var/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/MM = target
+ if(MM.numUses == 0)//skip if it has already been used up
+ return
+ if(!MM.active_owner)//apply bind if there is no active owner
+ if(ishuman(owner))
+ MM.temp_buff(owner)
+ src.desc = "Revive or fully heal yourself, but you can only do this once! Can be used when knocked out or dead."
+ to_chat(MM.active_owner, "You have binded the ember to yourself! The next time you use the necklace it will heal you!")
+ else if(MM.numUses == 1 && MM.active_owner)//revive / heal then remove usage
+ MM.second_chance()
+ MM.numUses = 0
+ MM.icon_state = "necklace_forsaken"
+ MM.desc = "A rose gold necklace that used to have a bright burning ember inside of it."
+ src.desc = "The necklaces ember has already been used..."
+
+//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=End of Necklace of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
+
+
+//Sifs loot chest
+/obj/structure/closet/crate/necropolis/sif
+ name = "Great Brown Wolf Sif's chest"
+
+/obj/structure/closet/crate/necropolis/sif/PopulateContents()
+ new /obj/item/melee/sword_of_the_forsaken(src)
+ new /obj/item/clothing/neck/necklace/necklace_of_the_forsaken(src)
+ new /obj/item/borg/upgrade/modkit/critical(src)
+
+/obj/structure/closet/crate/necropolis/sif/crusher
+ name = "Great Brown Wolf Sif's infinity chest"
+
+/obj/structure/closet/crate/necropolis/sif/crusher/PopulateContents()
+ new /obj/item/melee/sword_of_the_forsaken(src)
+ new /obj/item/clothing/neck/necklace/necklace_of_the_forsaken(src)
+ new /obj/item/crusher_trophy/dark_energy(src)
+
+
+//Rogue process loot
+/obj/structure/closet/crate/necropolis/rogue
+ name = "Rogue's chest"
+
+/obj/structure/closet/crate/necropolis/rogue/PopulateContents()
+ new /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer(src)
+ new /obj/item/rogue(src)
+
+/obj/structure/closet/crate/necropolis/rogue/crusher
+ name = "Corrupted Rogue's chest"
+
+/obj/structure/closet/crate/necropolis/rogue/crusher/PopulateContents()
+ new /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer(src)
+ new /obj/item/crusher_trophy/brokentech(src)
+ new /obj/item/rogue(src)
+
+/obj/item/rogue
+ name = "\proper Rogue's Drill"
+ desc = "A drill coupled with an internal mechanism that produces shockwaves on demand. Serves as a very robust melee."
+ sharpness = IS_SHARP
+ icon = 'sandcode/icons/obj/mining.dmi'
+ icon_state = "roguedrill"
+ lefthand_file = 'sandcode/icons/mob/inhands/equipment/mining_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/equipment/mining_righthand.dmi'
+ item_state = "roguedrill"
+ w_class = WEIGHT_CLASS_BULKY
+ tool_behaviour = TOOL_MINING
+ toolspeed = 0.1
+ slot_flags = ITEM_SLOT_BELT
+ custom_materials = list(/datum/material/diamond=2000, /datum/material/titanium=20000, /datum/material/plasma=20000)
+ usesound = 'sound/weapons/drill.ogg'
+ hitsound = 'sound/weapons/drill.ogg'
+ attack_verb = list("drilled")
+ var/cooldowntime = 50
+ var/cooldown = 0
+ var/range = 7
+
+/obj/item/rogue/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=20)
+
+/obj/item/rogue/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
+ . = ..()
+ if(user.a_intent == INTENT_HARM)
+ var/datum/component/two_handed/TH = GetComponent(/datum/component/two_handed)
+ if(isliving(target) && TH.wielded && proximity_flag && cooldown <= world.time)
+ cooldown = world.time + (cooldowntime * 0.75)
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ var/mob/living/M = target
+ M.DefaultCombatKnockdown(30)
+ M.adjustStaminaLoss(20)
+ else if(TH.wielded)
+ if(cooldown < world.time)
+ cooldown = world.time + cooldowntime
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ var/list/hit_things = list()
+ var/turf/T = get_turf(get_step(user, user.dir))
+ var/ogdir = user.dir
+ var/turf/otherT = get_step(T, turn(ogdir, 90))
+ var/turf/otherT2 = get_step(T, turn(ogdir, -90))
+ for(var/i in 1 to range)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(otherT)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(otherT2)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things))
+ L.Stun(20)
+ L.adjustBruteLoss(10)
+ hit_things += L
+ for(var/mob/living/L in otherT.contents)
+ if(L != src && !(L in hit_things))
+ L.Stun(20)
+ L.adjustBruteLoss(10)
+ hit_things += L
+ for(var/mob/living/L in otherT2.contents)
+ if(L != src && !(L in hit_things))
+ L.Stun(20)
+ L.adjustBruteLoss(10)
+ hit_things += L
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled(user)
+ if(ismineralturf(otherT))
+ var/turf/closed/mineral/M = otherT
+ M.gets_drilled(user)
+ if(ismineralturf(otherT2))
+ var/turf/closed/mineral/M = otherT2
+ M.gets_drilled(user)
+ T = get_step(T, ogdir)
+ otherT = get_step(otherT, ogdir)
+ otherT2 = get_step(otherT2, ogdir)
+ sleep(2)
diff --git a/sandcode/code/modules/mining/machine_vending.dm b/sandcode/code/modules/mining/machine_vending.dm
new file mode 100644
index 0000000000..165d620cfe
--- /dev/null
+++ b/sandcode/code/modules/mining/machine_vending.dm
@@ -0,0 +1,66 @@
+/obj/machinery/mineral/equipment_vendor
+ prize_list = list( //if you add something to this, please, for the love of god, sort it by price/type. use tabs and not spaces.
+ new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
+ new /datum/data/mining_equipment("50 Point Transfer Card", /obj/item/card/mining_point_card, 50),
+ new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
+ new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
+ new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
+ new /datum/data/mining_equipment("Absinthe", /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium, 100),
+ new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
+ new /datum/data/mining_equipment("Miner's Salve Patch", /obj/item/reagent_containers/pill/patch/salve, 150),
+ new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
+ new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
+ new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
+ new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
+ new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
+ new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
+ new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450),
+ new /datum/data/mining_equipment("GAR Meson Scanners", /obj/item/clothing/glasses/meson/gar, 500),
+ new /datum/data/mining_equipment("Explorer's Webbing", /obj/item/storage/belt/mining, 500),
+ new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500),
+ new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500),
+ new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600),
+ new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750),
+ new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/kinetic_crusher, 750),
+ new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
+ new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750),
+ new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800),
+ new /datum/data/mining_equipment("Burn First-Aid Kit", /obj/item/storage/firstaid/fire, 800),
+ new /datum/data/mining_equipment("First-Aid Kit", /obj/item/storage/firstaid/regular, 800),
+ new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 800),
+ new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
+ new /datum/data/mining_equipment("Mini Extinguisher", /obj/item/extinguisher/mini, 1000),
+ new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1000),
+ new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
+ new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
+ new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000),
+ new /datum/data/mining_equipment("1000 Point Transfer Card", /obj/item/card/mining_point_card/mp1000, 1000),
+ new /datum/data/mining_equipment("1500 Point Transfer Card", /obj/item/card/mining_point_card/mp1500, 1500),
+ new /datum/data/mining_equipment("2000 Point Transfer Card", /obj/item/card/mining_point_card/mp2000, 2000),
+ new /datum/data/mining_equipment("Jetpack Upgrade", /obj/item/tank/jetpack/suit, 2000),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/clothing/suit/space/hardsuit/mining, 2000),
+ new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
+ new /datum/data/mining_equipment("Spare Suit Voucher", /obj/item/suit_voucher, 2000),
+ new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
+ new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
+ new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
+ new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000),
+ new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
+ new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
+ new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
+ new /datum/data/mining_equipment("Minebot Cooldown Upgrade", /obj/item/borg/upgrade/modkit/cooldown/minebot, 600),
+ new /datum/data/mining_equipment("Minebot AI Upgrade", /obj/item/slimepotion/slime/sentience/mining, 1000),
+ new /datum/data/mining_equipment("KA Minebot Passthrough", /obj/item/borg/upgrade/modkit/minebot_passthrough, 100),
+ new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
+ new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
+ new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
+ new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
+ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
+ new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
+ new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
+ new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
+ new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000),
+ new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000),
+ new /datum/data/mining_equipment("Kinetic Destroyer", /obj/item/twohanded/kinetic_crusher/premiumcrusher, 12000)
+ )
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
new file mode 100644
index 0000000000..795dc42dee
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -0,0 +1,12 @@
+/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner
+ crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer, /obj/item/borg/upgrade/modkit/lifesteal/miner, /obj/item/crusher_trophy/miner_eye)
+ loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer, /obj/item/borg/upgrade/modkit/lifesteal/miner)
+ songs = list("2360" = sound(file = 'sandcode/sound/ambience/igneon-system-and-death-machine-sins.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC), "2440" = sound(file = 'sandcode/sound/ambience/machinegirl_excruciatingdeath.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) // I don't actually know if any of this is copyright free or CC. Fuck.
+ glorymessageshand = list("grabs the blood-drunk's arm, flips their cleaving saw with the other hand, and forcefully makes them chop off their own head with it!", "grabs blood-drunk by their PKA, aims it at their head and then shoots, splattering his brains out!", "rips out both of the blood-drunk's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!")
+ glorymessagescrusher = list("chops off the blood-drunk's cleaving saw arm in one swift move, then grabs the saw and swings it against their head, chopping their skull vertically in half!", "bashes the miner to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the blood-drunk diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the moaning fiend!")
+ glorymessagespka = list("grabs the blood-drunk by the neck and flips them, shooting through their guts with a PKA blast!", "shoots at the blood-drunk's shoulder, exploding their arm! To finish the fiend off, they grab their PKA and bonk the blood-drunk's head inside their torso!", "doesn't bother with being fancy, and simply shoots at the blood-drunk's head with their PKA, exploding it in one violent blast!")
+ glorymessagespkabayonet = list("rams into the blood-drunk's stomach with their PKA's bayonet, knocking them and themselves down! To finish the fiend off, they simply stab into their torso like a madman with their bayonet!", "kicks the blood-drunk's knee hard, breaking it! While the fiend is stunned and barely standing, their chop their head off with the PKA's bayonet!")
+ glorythreshold = 50
+
+/obj/item/projectile/kinetic/miner
+ color = "#FF0000"
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
new file mode 100644
index 0000000000..2e835e9b8b
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -0,0 +1,141 @@
+#define MEDAL_PREFIX "Bubblegum"
+
+/*
+
+BUBBLEGUM
+
+Removes slaughterlings (because they are bullshit), instead replacing them with the blood rending thing from tg
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum
+ death_sound = 'sandcode/sound/misc/gorenest.ogg' //fuck it
+ var/movesound = 'sound/effects/meteorimpact.ogg'
+ songs = list("1860" = sound(file = 'sandcode/sound/ambience/bfgdivision.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC), "2070" = sound(file = 'sandcode/sound/ambience/theonlythingtheyfearisyou.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) //Thanks Mr. Infringio!
+ glorymessageshand = list("grabs bubblegum by the leg, and pulls them down! While downed, they climb on their torso and punch through it, smashing their demonic heart!", "goes around bubblegum and climbs them by their back, once on top of their head they punch right through the demon's skull, ripping out brain matter and killing it as it limply falls on the ground!")
+ glorymessagescrusher = list("jumps and chops off both of bubblegum's legs in one swift move with their crusher! To finish off the now wheelchair-bound demon, they chop at the torso vertically, getting the crusher stuck in the process but killing the demonic fiend!", "goes around bubblegum and climbs them by their back, once on the top they chop their head off with the crusher!")
+ glorymessagespka = list("shoots the weakened demon in the chest, opening a hole and exposing their inner core! With another blast, the demon's heart explodes, and they fall dead and limp on the ground!", "shoots the weakened demon's head, stunning them and revealing their brain! Another PKA blast finishes off what little brainmatter they had!")
+ glorymessagespkabayonet = list("shoots the weakened demon in the chest, opening a hole and exposing their inner core! They run onto the now exposed heart and stab it repeatedly with their bayonet, killing the demon off!")
+ footstep_type = FOOTSTEP_MOB_HEAVY
+ var/dont_move = TRUE //impedes bubbles from moving while using the blood jaunt
+
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
+ . = ..()
+ if(dont_move)
+ return FALSE
+ playsound(src, movesound, 200, TRUE, 2, TRUE)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
+ anger_modifier = clamp(((maxHealth - health)/50),0,20)
+ if(charging)
+ return
+ ranged_cooldown = world.time + ranged_cooldown_time
+ blood_warp()
+ bloodsmacks()
+ if(prob(25))
+ INVOKE_ASYNC(src, .proc/blood_spray)
+ INVOKE_ASYNC(src, .proc/bloodsmacks)
+ else
+ if(health > maxHealth/2 && !client)
+ INVOKE_ASYNC(src, .proc/charge)
+ else
+ INVOKE_ASYNC(src, .proc/triple_charge)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/charge()
+ bloodsmacks()
+ var/turf/T = get_turf(target)
+ if(!T || T == loc)
+ return
+ new /obj/effect/temp_visual/dragon_swoop(T)
+ charging = 1
+ DestroySurroundings()
+ walk(src, 0)
+ setDir(get_dir(src, T))
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
+ animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5)
+ sleep(5)
+ throw_at(T, get_dist(src, T), 1, src, 0)
+ charging = 0
+ Goto(target, move_to_delay, minimum_distance)
+ bloodsmacks()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmacks()
+ for(var/obj/effect/decal/cleanable/blood/B in view(7, src))
+ var/turf/T = get_turf(B)
+ var/mobcount = 0
+ for(var/mob/living/L in T.contents)
+ if(L != src)
+ mobcount++
+ if(mobcount)
+ var/hand = rand(0,1)
+ INVOKE_ASYNC(src, .proc/bloodsmack, T, hand)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T)
+ else
+ new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T)
+ sleep(5)
+ for(var/mob/living/L in T)
+ if(!faction_check_mob(L))
+ to_chat(L, "[src] rends you!")
+ playsound(T, attack_sound, 100, TRUE, -1)
+ var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
+ L.apply_damage(30, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null)) // You really, really, really better not stand in blood!
+ sleep(3)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/blood_warp()
+ var/obj/effect/decal/cleanable/blood/found_bloodpool
+ var/list/pools = list()
+ var/can_jaunt = FALSE
+ for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2))
+ if(nearby.bloodiness >= 20)
+ can_jaunt = TRUE
+ break
+ if(!can_jaunt)
+ return
+ for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2))
+ if(nearby.bloodiness >= 20)
+ pools += nearby
+ if(pools.len)
+ shuffle_inplace(pools)
+ found_bloodpool = pick(pools)
+ if(found_bloodpool)
+ visible_message("[src] sinks into the blood...")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ alpha = 0
+ dont_move = TRUE
+ sleep(rand(2, 4))
+ forceMove(get_turf(found_bloodpool))
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ alpha = 100
+ dont_move = FALSE
+ visible_message("And springs back out!")
+
+
+/obj/effect/temp_visual/bubblegum_hands
+ icon = 'icons/effects/bubblegum.dmi'
+ duration = 9
+
+/obj/effect/temp_visual/bubblegum_hands/rightthumb
+ icon_state = "rightthumbgrab"
+
+/obj/effect/temp_visual/bubblegum_hands/leftthumb
+ icon_state = "leftthumbgrab"
+
+/obj/effect/temp_visual/bubblegum_hands/rightpaw
+ icon_state = "rightpawgrab"
+ layer = BELOW_MOB_LAYER
+
+/obj/effect/temp_visual/bubblegum_hands/leftpaw
+ icon_state = "leftpawgrab"
+ layer = BELOW_MOB_LAYER
+
+/obj/effect/temp_visual/bubblegum_hands/rightsmack
+ icon_state = "rightsmack"
+
+/obj/effect/temp_visual/bubblegum_hands/leftsmack
+ icon_state = "leftsmack"
+
+#undef MEDAL_PREFIX
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegumhard.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegumhard.dm
new file mode 100644
index 0000000000..8ab304be0e
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegumhard.dm
@@ -0,0 +1,479 @@
+#define BUBBLEGUM_SMASH (health <= maxHealth*0.5) // angery
+#define BUBBLEGUM_CAN_ENRAGE (enrage_till + (enrage_time * 2) <= world.time)
+#define BUBBLEGUM_IS_ENRAGED (enrage_till > world.time)
+
+/*
+BUBBLEGUM (HARD)
+Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence.
+Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size.
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power
+It leaves blood trails behind wherever it goes, its clones do as well.
+It tries to strike at its target through any bloodpools under them; if it fails to do that.
+If it does warp it will enter an enraged state, becoming immune to all projectiles, becoming much faster, and dealing damage and knockback to anything that gets in the cloud around it.
+It may summon clones charging from all sides, one of these charges being bubblegum himself.
+It can charge at its target, and also heavily damaging anything directly hit in the charge.
+If at half health it will start to charge from all sides with clones.
+When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things:
+ 1. A bottle that, when activated, drives everyone nearby into a frenzy
+ 2. A contract that marks for death the chosen target
+ 3. A spellblade that can slice off limbs at range
+Difficulty: Hard
+*/
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard
+ name = "enraged bubblegum"
+ desc = "In what passes for a hierarchy among slaughter demons, this one is god."
+ attack_verb_continuous = "brutally rends"
+ attack_verb_simple = "brutally rend"
+ speed = 5
+ move_to_delay = 5
+ retreat_distance = 5
+ minimum_distance = 5
+ rapid_melee = 8 // every 1/4 second
+ melee_queue_distance = 20 // as far as possible really, need this because of blood warp
+ ranged = TRUE
+ del_on_death = TRUE
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/hard/crusher)
+ loot = list(/obj/structure/closet/crate/necropolis/bubblegum/hard)
+ charging = FALSE
+ var/enrage_till = 0
+ var/enrage_time = 70
+ var/revving_charge = FALSE
+ nest_range = 10
+ true_spawn = TRUE
+
+ deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now, slayer... "
+ deathsound = 'sound/magic/enter_blood.ogg'
+
+obj/item/gps/internal/bubblegum/hard
+ icon_state = null
+ gpstag = "Enraged Bloody Signal"
+ desc = "You're not quite sure how a signal can be enraged, neither how it can be bloody."
+ invisibility = 100
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/Initialize()
+ ..()
+ internal = new/obj/item/gps/internal/bubblegum/hard(src)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/OpenFire()
+ if(charging)
+ return
+
+ anger_modifier = clamp(((maxHealth - health)/60),0,20)
+ enrage_time = initial(enrage_time) * clamp(anger_modifier / 20, 0.5, 1)
+ ranged_cooldown = world.time + 50
+
+ if(!try_bloodattack() || prob(25 + anger_modifier))
+ blood_warp()
+
+ if(!BUBBLEGUM_SMASH)
+ triple_charge()
+ else
+ if(prob(50 + anger_modifier))
+ hallucination_charge()
+ else
+ surround_with_hallucinations()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/triple_charge()
+ charge(delay = 8)
+ charge(delay = 6)
+ charge(delay = 4)
+ SetRecoveryTime(15)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/hallucination_charge()
+ if(!BUBBLEGUM_SMASH || prob(33))
+ hallucination_charge_around(times = 6, delay = 12)
+ SetRecoveryTime(10)
+ else
+ hallucination_charge_around(times = 4, delay = 14)
+ hallucination_charge_around(times = 4, delay = 10)
+ hallucination_charge_around(times = 4, delay = 10)
+ triple_charge()
+ SetRecoveryTime(20)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/surround_with_hallucinations()
+ for(var/i = 1 to 5)
+ INVOKE_ASYNC(src, .proc/hallucination_charge_around, 2, 8, 2, 0, 4)
+ if(ismob(target))
+ charge(delay = 8)
+ else
+ sleep(10)
+ SetRecoveryTime(20)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/charge(atom/chargeat = target, delay = 8, chargepast = 2)
+ if(!chargeat)
+ return
+ var/chargeturf = get_turf(chargeat)
+ if(!chargeturf)
+ return
+ var/dir = get_dir(src, chargeturf)
+ var/turf/T = get_ranged_target_turf(chargeturf, dir, chargepast)
+ if(!T)
+ return
+ new /obj/effect/temp_visual/dragon_swoop/bubblegum(T)
+ charging = TRUE
+ revving_charge = TRUE
+ DestroySurroundings()
+ walk(src, 0)
+ setDir(dir)
+ var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
+ animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3)
+ sleep(delay)
+ revving_charge = FALSE
+ var/movespeed = 0.7
+ walk_towards(src, T, movespeed)
+ sleep(get_dist(src, T) * movespeed)
+ walk(src, 0) // cancel the movement
+ try_bloodattack()
+ charging = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/get_mobs_on_blood()
+ var/list/targets = ListTargets()
+ . = list()
+ for(var/mob/living/L in targets)
+ var/list/bloodpool = get_pools(get_turf(L), 0)
+ if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD))
+ . += L
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/try_bloodattack()
+ var/list/targets = get_mobs_on_blood()
+ if(targets.len)
+ INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50))
+ return TRUE
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/bloodattack(list/targets, handedness)
+ var/mob/living/target_one = pick_n_take(targets)
+ var/turf/target_one_turf = get_turf(target_one)
+ var/mob/living/target_two
+ if(targets.len)
+ target_two = pick_n_take(targets)
+ var/turf/target_two_turf = get_turf(target_two)
+ if(target_two.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_two_turf, handedness)
+ else
+ bloodsmack(target_two_turf, handedness)
+
+ if(target_one)
+ var/list/pools = get_pools(get_turf(target_one), 0)
+ if(pools.len)
+ target_one_turf = get_turf(target_one)
+ if(target_one_turf)
+ if(target_one.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_one_turf, !handedness)
+ else
+ bloodsmack(target_one_turf, !handedness)
+
+ if(!target_two && target_one)
+ var/list/poolstwo = get_pools(get_turf(target_one), 0)
+ if(poolstwo.len)
+ target_one_turf = get_turf(target_one)
+ if(target_one_turf)
+ if(target_one.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_one_turf, handedness)
+ else
+ bloodsmack(target_one_turf, handedness)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/bloodsmack(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/temp_visual/bubblegum_handshard/rightsmack(T)
+ else
+ new /obj/effect/temp_visual/bubblegum_handshard/leftsmack(T)
+ sleep(4)
+ for(var/mob/living/L in T)
+ if(!faction_check_mob(L))
+ to_chat(L, "[src] rends you!")
+ playsound(T, attack_sound, 100, TRUE, -1)
+ var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
+ L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration))
+ sleep(3)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/bloodgrab(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/temp_visual/bubblegum_handshard/rightpaw(T)
+ new /obj/effect/temp_visual/bubblegum_handshard/rightthumb(T)
+ else
+ new /obj/effect/temp_visual/bubblegum_handshard/leftpaw(T)
+ new /obj/effect/temp_visual/bubblegum_handshard/leftthumb(T)
+ sleep(6)
+ for(var/mob/living/L in T)
+ if(!faction_check_mob(L))
+ if(L.stat != CONSCIOUS)
+ to_chat(L, "[src] drags you through the blood!")
+ playsound(T, 'sound/magic/enter_blood.ogg', 100, TRUE, -1)
+ var/turf/targetturf = get_step(src, dir)
+ L.forceMove(targetturf)
+ playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, TRUE, -1)
+ addtimer(CALLBACK(src, .proc/devour, L), 2)
+ sleep(1)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/blood_warp()
+ if(Adjacent(target))
+ return FALSE
+ var/list/can_jaunt = get_pools(get_turf(src), 1)
+ if(!can_jaunt.len)
+ return FALSE
+
+ var/list/pools = get_pools(get_turf(target), 5)
+ var/list/pools_to_remove = get_pools(get_turf(target), 4)
+ pools -= pools_to_remove
+ if(!pools.len)
+ return FALSE
+
+ var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src)
+ DA.color = "#FF0000"
+ var/oldtransform = DA.transform
+ DA.transform = matrix()*2
+ animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3)
+ sleep(3)
+ qdel(DA)
+
+ var/obj/effect/decal/cleanable/blood/found_bloodpool
+ pools = get_pools(get_turf(target), 5)
+ pools_to_remove = get_pools(get_turf(target), 4)
+ pools -= pools_to_remove
+ if(pools.len)
+ shuffle_inplace(pools)
+ found_bloodpool = pick(pools)
+ if(found_bloodpool)
+ visible_message("[src] sinks into the blood...")
+ playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, TRUE, -1)
+ forceMove(get_turf(found_bloodpool))
+ playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, TRUE, -1)
+ visible_message("And springs back out!")
+ blood_enrage()
+ return TRUE
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/be_aggressive()
+ if(BUBBLEGUM_IS_ENRAGED)
+ return TRUE
+ if(isliving(target))
+ var/mob/living/livingtarget = target
+ return (livingtarget.stat != CONSCIOUS)
+ return FALSE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/get_retreat_distance()
+ return (be_aggressive() ? null : initial(retreat_distance))
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/get_minimum_distance()
+ return (be_aggressive() ? 1 : initial(minimum_distance))
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/update_approach()
+ retreat_distance = get_retreat_distance()
+ minimum_distance = get_minimum_distance()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/blood_enrage()
+ if(!BUBBLEGUM_CAN_ENRAGE)
+ return FALSE
+ enrage_till = world.time + enrage_time
+ update_approach()
+ change_move_delay(3.75)
+ var/newcolor = rgb(149, 10, 10)
+ add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
+ var/datum/callback/cb = CALLBACK(src, .proc/blood_enrage_end)
+ addtimer(cb, enrage_time)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/blood_enrage_end(var/newcolor = rgb(149, 10, 10))
+ update_approach()
+ change_move_delay()
+ remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, newcolor)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/change_move_delay(var/newmove = initial(move_to_delay))
+ move_to_delay = newmove
+ set_varspeed(move_to_delay)
+ handle_automated_action() // need to recheck movement otherwise move_to_delay won't update until the next checking aka will be wrong speed for a bit
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/get_pools(turf/T, range)
+ . = list()
+ for(var/obj/effect/decal/cleanable/nearby in view(T, range))
+ if(nearby.can_bloodcrawl_in())
+ . += nearby
+
+/obj/effect/decal/cleanable/blood/bubblegumhard
+ bloodiness = 0
+
+/obj/effect/decal/cleanable/blood/bubblegumhard/can_bloodcrawl_in()
+ return TRUE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/hallucination_charge_around(times = 4, delay = 10, chargepast = 0, useoriginal = 1, radius)
+ var/startingangle = rand(1, 360)
+ if(!target)
+ return
+ var/turf/chargeat = get_turf(target)
+ var/srcplaced = FALSE
+ if(!radius)
+ radius = times
+ for(var/i = 1 to times)
+ var/ang = (startingangle + 360/times * i)
+ if(!chargeat)
+ return
+ var/turf/place = locate(chargeat.x + cos(ang) * radius, chargeat.y + sin(ang) * radius, chargeat.z)
+ if(!place)
+ continue
+ if(!nest || nest && nest.parent && get_dist(nest.parent, place) <= nest_range)
+ if(!srcplaced && useoriginal)
+ forceMove(place)
+ srcplaced = TRUE
+ continue
+ var/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/B = new /mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination(src.loc)
+ B.forceMove(place)
+ INVOKE_ASYNC(B, .proc/charge, chargeat, delay, chargepast)
+ if(useoriginal)
+ charge(chargeat, delay, chargepast)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+ . = ..()
+ if(. > 0 && prob(25))
+ var/obj/effect/decal/cleanable/blood/gibs/bubblegumhard/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegumhard(loc)
+ if(prob(40))
+ step(B, pick(GLOB.cardinals))
+ else
+ B.setDir(pick(GLOB.cardinals))
+
+/obj/effect/decal/cleanable/blood/gibs/bubblegumhard
+ name = "thick blood"
+ desc = "Thick, splattered blood."
+ random_icon_states = list("gib3", "gib5", "gib6")
+ bloodiness = 20
+
+/obj/effect/decal/cleanable/blood/gibs/bubblegumhard/can_bloodcrawl_in()
+ return TRUE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/AttackingTarget()
+ if(!charging)
+ . = ..()
+ if(.)
+ recovery_time = world.time + 30 //can only attack melee once every 3 seconds but rapid_melee gives higher priority
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/bullet_act(obj/item/projectile/P)
+ if(BUBBLEGUM_IS_ENRAGED)
+ visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!", "You deflect the projectile!")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, TRUE)
+ return BULLET_ACT_BLOCK
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/ex_act(severity, target)
+ if(severity >= EXPLODE_LIGHT)
+ return
+ severity = EXPLODE_LIGHT // puny mortals
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/proc/CanAllowThrough(atom/movable/mover, turf/target)
+ if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination))
+ return TRUE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/Goto(target, delay, minimum_distance)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/MoveToTarget(list/possible_targets)
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/Move()
+ update_approach()
+ if(revving_charge)
+ return FALSE
+ if(charging)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
+ DestroySurroundings()
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/Moved(atom/OldLoc, Dir, Forced = FALSE)
+ if(Dir)
+ new /obj/effect/decal/cleanable/blood/bubblegumhard(src.loc)
+ if(charging)
+ DestroySurroundings()
+ playsound(src, 'sound/effects/meteorimpact.ogg', 200, TRUE, 2, TRUE)
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/Bump(atom/A)
+ if(charging)
+ if(isturf(A) || isobj(A) && A.density)
+ A.ex_act(EXPLODE_HEAVY)
+ DestroySurroundings()
+ if(isliving(A))
+ var/mob/living/L = A
+ L.visible_message("[src] slams into [L]!", "[src] tramples you into the ground!")
+ src.forceMove(get_turf(L))
+ L.apply_damage(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination) ? 15 : 30, BRUTE)
+ playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, TRUE)
+ shake_camera(L, 4, 3)
+ shake_camera(src, 2, 3)
+ ..()
+
+/obj/effect/temp_visual/dragon_swoop/bubblegum
+ duration = 10
+
+/obj/effect/temp_visual/bubblegum_handshard
+ icon = 'icons/effects/bubblegum.dmi'
+ duration = 9
+
+/obj/effect/temp_visual/bubblegum_handshard/rightthumb
+ icon_state = "rightthumbgrab"
+
+/obj/effect/temp_visual/bubblegum_handshard/leftthumb
+ icon_state = "leftthumbgrab"
+
+/obj/effect/temp_visual/bubblegum_handshard/rightpaw
+ icon_state = "rightpawgrab"
+ layer = BELOW_MOB_LAYER
+
+/obj/effect/temp_visual/bubblegum_handshard/leftpaw
+ icon_state = "leftpawgrab"
+ layer = BELOW_MOB_LAYER
+
+/obj/effect/temp_visual/bubblegum_handshard/rightsmack
+ icon_state = "rightsmack"
+
+/obj/effect/temp_visual/bubblegum_handshard/leftsmack
+ icon_state = "leftsmack"
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination
+ name = "bubblegum's hallucination"
+ desc = "Is that really just a hallucination?"
+ health = 1
+ maxHealth = 1
+ alpha = 127.5
+ crusher_loot = null
+ loot = null
+ deathmessage = "Explodes into a pool of blood!"
+ deathsound = 'sound/effects/splat.ogg'
+ true_spawn = FALSE
+ mouse_opacity = 0 //This is so clients wont hover and store them, causing them to fail GC
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/Initialize()
+ ..()
+ toggle_ai(AI_OFF)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/charge(atom/chargeat = target, delay = 3, chargepast = 2)
+ ..()
+ qdel(src)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/Destroy()
+ new /obj/effect/decal/cleanable/blood(get_turf(src))
+ . = ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/CanAllowThrough(atom/movable/mover, turf/target)
+ if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) // hallucinations should not be stopping bubblegum or eachother
+ return TRUE
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/Life()
+ return
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
+ return
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/OpenFire()
+ return
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/AttackingTarget()
+ return
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/hard/hallucination/try_bloodattack()
+ return
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
new file mode 100644
index 0000000000..fdadfc856f
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -0,0 +1,15 @@
+/mob/living/simple_animal/hostile/megafauna/colossus
+ songs = list("1170" = sound(file = 'sandcode/sound/ambience/theopenedway.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) //Shadow of the colossus OST
+ glorymessageshand = list("grabs the colossus by the leg, and pulls them down! While downed, they climb on his neck and violently rip off their vocal cords!", "goes around the colossus and climbs them by their back, once on top of their shoulder they grab it's arm and aim the blaster at the creature's head, which finishes itself off with a penetrating death bolt that blasts off their head!")
+ glorymessagescrusher = list("throws their crusher at the colossus' head, which surprisingly works! Humiliated, the angelic creature dies with a big fucking axe stuck on their skull!", "chops off one of the colossus' legs with the crusher, as it falls down they grab the leg and use it as a makeshift club on the creature's head, which explodes in differently-sized giblets on impact!")
+ glorymessagespka = list("somehow parries a death bolt with a PKA blast, which goes right back to it's owner's torso, opening a hole on them and killing them!")
+ glorymessagespkabayonet = list("goes around the colossus and climbs on their back, ramming their bayonet on it's spine and falling down holding it, pretty much gruesomely opening the colossus' back!")
+
+/mob/living/simple_animal/hostile/megafauna/colossus/enrage(mob/living/L)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.mind)
+ if(istype(H.mind.martial_art, /datum/martial_art/the_sleeping_carp) || istype(H.mind.martial_art, /datum/martial_art/the_rising_bass))
+ . = TRUE
+ if(is_species(H, /datum/species/golem/sand))
+ . = TRUE
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
new file mode 100644
index 0000000000..970e80a432
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -0,0 +1,2 @@
+/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner
+ deathsound = "bodyfall"
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 08d7c69d82..bd6eb9cf37 100644
--- a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -1,3 +1,24 @@
+/mob/living/simple_animal/hostile/megafauna/dragon
+ songs = list("1860" = sound(file = 'sandcode/sound/ambience/duskcreations.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC), "2350" = sound(file = 'sandcode/sound/ambience/dragonborn.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) // Andrew is a nice guy, he'll let it slide. Taken from the DUSK OST. Not sure about the skyrim theme though...
+ glorymessageshand = list("climbs atop the drake's head as it dangles weakly near the ground, ripping its left horn off and jumping down before swinging it at the drake's face full force, cracking its maw!", "goes around the dragon and rips off their tail, using it's spiked end to beat the dragon's bloodied face until it cracks open and it dies!")
+ glorymessagescrusher = list("chops off the dragon's head by the neck, and it falls down with a strong thud!", "rams into the dragon's skull with the hilt of their crusher repeatedly and cracking holes into their skull each time, turning it's brain into mush!")
+ glorymessagespka = list("shoots at the dragon's wings with their PKA, exploding them into bizarre giblets! They then finish the poor creature off with a point-blank blast to the head, exploding it!")
+ glorymessagespkabayonet = list("goes around the drake and chops off their tail's spike with their bayonet, then climbs onto their head and makes them eat it!")
+
+/mob/living/simple_animal/hostile/megafauna/dragon/lesser/akatosh
+ name = "Holy Dragon"
+ desc = "Destroyer of the gates."
+ icon = 'sandcode/icons/mob/lavaland/drake_greyscale.dmi'
+ icon_state = "dragon"
+ maxHealth = 350
+ health = 350
+ color = "#FFFF00"
+ light_range = 3
+ light_color = "#FFFF00"
+ light_power = 2
+ faction = list("neutral")
+ smallsprite = /datum/action/small_sprite/drake/akatosh
+
/mob/living/simple_animal/hostile/megafauna/dragon/sand
name = "Sand"
desc = "The ultimate form of lord Sand, if he is in this form, he is either saving someone from something, or killing some honkers"
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drakehard.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drakehard.dm
new file mode 100644
index 0000000000..b3172e1deb
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/drakehard.dm
@@ -0,0 +1,509 @@
+/*
+ASH DRAKE
+Ash drakes spawn randomly wherever a lavaland creature is able to spawn. They are the draconic guardians of the Necropolis.
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+Whenever possible, the drake will breathe fire directly at it's target, igniting and heavily damaging anything caught in the blast.
+It also often causes lava to pool from the ground around you - many nearby turfs will temporarily turn into lava, dealing damage to anything on the turfs.
+The drake also utilizes its wings to fly into the sky, flying after its target and attempting to slam down on them. Anything near when it slams down takes huge damage.
+ - Sometimes it will chain these swooping attacks over and over, making swiftness a necessity.
+ - Sometimes, it will encase its target in an arena of lava
+When an ash drake dies, it leaves behind a chest that can contain four things:
+ 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power
+ 2. A lava staff that allows its wielder to create lava
+ 3. A spellbook and wand of fireballs
+ 4. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves.
+When butchered, they leave behind diamonds, sinew, bone, and ash drake hide. Ash drake hide can be used to create a hooded cloak that protects its wearer from ash storms.
+Difficulty: Medium
+*/
+/mob/living/simple_animal/hostile/megafauna/dragon/hard
+ name = "enraged ash drake"
+ desc = "Ultra-guardian of the necropolis."
+ health = 2500
+ maxHealth = 2500
+ armour_penetration = 40
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ speed = 5
+ move_to_delay = 4
+ ranged = TRUE
+ pixel_x = -16
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/hard/crusher)
+ loot = list(/obj/structure/closet/crate/necropolis/dragon/hard)
+ butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
+ guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10)
+ swooping = NONE
+ var/player_cooldown = 0
+ deathmessage = "collapses into a pile of bones, its flesh sloughing away."
+ deathsound = 'sound/magic/demon_dies.ogg'
+
+/obj/item/gps/internal/dragon/hard
+ icon_state = null
+ gpstag = "Enraged Fiery Signal"
+ desc = "Here there be 'bad' dragons."
+ invisibility = 100
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/Initialize()
+ ..()
+ internal = new/obj/item/gps/internal/dragon/hard(src)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/OpenFire()
+ if(swooping)
+ return
+
+ anger_modifier = clamp(((maxHealth - health)/50),0,20)
+ ranged_cooldown = world.time + ranged_cooldown_time
+
+ if(prob(25 + anger_modifier))
+ lava_swoop()
+ else if(prob(15 + anger_modifier))
+ if(prob(75))
+ swooop_attack()
+ else
+ triple_swooop()
+ else if(prob(5 + anger_modifier))
+ triple_lava_swoop()
+ else if(prob(10+anger_modifier))
+ shoot_fire_attack()
+ else
+ if(prob(50))
+ fire_cone()
+ else
+ if(prob(75))
+ fire_rain()
+ else
+ fire_cone()
+ fire_rain()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/shoot_fire_attack()
+ if(health < maxHealth*0.5)
+ mass_fire()
+ else
+ fire_cone()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/fire_rain()
+ if(!target)
+ return
+ target.visible_message("Fire rains from the sky!")
+ for(var/turf/turf in range(9,get_turf(target)))
+ if(prob(11))
+ new /obj/effect/temp_visual/target/hard(turf)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/lava_pools(amount, delay = 0.8)
+ if(!target)
+ return
+ target.visible_message("Lava starts to pool up around you!")
+
+ while(amount > 0)
+ if(QDELETED(target))
+ break
+ var/turf/TT = get_turf(target)
+ var/turf/T = pick(RANGE_TURFS(1,TT))
+ new /obj/effect/temp_visual/lava_warning/hard(T, 60) // longer reset time for the lava
+ amount--
+ sleep(delay)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/lava_swoop(amount = 30)
+ if(health < maxHealth * 0.5)
+ return swooop_attack(lava_arena = TRUE, swoop_cooldown = 60)
+ INVOKE_ASYNC(src, .proc/lava_pools, amount)
+ swooop_attack(FALSE, target, 1000) // longer cooldown until it gets reset below
+ sleep(0)
+ fire_cone()
+ if(health < maxHealth*0.66)
+ sleep(10)
+ fire_cone()
+ sleep(10)
+ fire_cone()
+ SetRecoveryTime(20)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/triple_lava_swoop(amount = 45)
+ lava_swoop()
+ sleep(2)
+ lava_swoop()
+ sleep(2)
+ lava_swoop()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/mass_fire(spiral_count = 12, range = 15, times = 3)
+ sleep(0)
+ for(var/i = 1 to times)
+ SetRecoveryTime(50)
+ playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE)
+ var/increment = 360 / spiral_count
+ for(var/j = 1 to spiral_count)
+ var/list/turfs = line_target(j * increment + i * increment / 2, range, src)
+ INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ sleep(25)
+ SetRecoveryTime(30)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/lava_arena()
+ if(!target)
+ return
+ target.visible_message("[src] encases you in an arena of fire!")
+ var/amount = 3
+ var/turf/center = get_turf(target)
+ var/list/walled = RANGE_TURFS(3, center) - RANGE_TURFS(2, center)
+ var/list/drakewalls = list()
+ for(var/turf/T in walled)
+ drakewalls += new /obj/effect/temp_visual/drakewall(T) // no people with lava immunity can just run away from the attack for free
+ var/list/indestructible_turfs = list()
+ for(var/turf/T in RANGE_TURFS(2, center))
+ if(istype(T, /turf/open/indestructible))
+ continue
+ if(!istype(T, /turf/closed/indestructible))
+ T.ChangeTurf(/turf/open/floor/plating/asteroid/basalt/lava_land_surface, flags = CHANGETURF_INHERIT_AIR)
+ else
+ indestructible_turfs += T
+ sleep(10) // give them a bit of time to realize what attack is actually happening
+
+ var/list/turfs = RANGE_TURFS(2, center)
+ while(amount > 0)
+ var/list/empty = indestructible_turfs.Copy() // can't place safe turfs on turfs that weren't changed to be open
+ var/any_attack = 0
+ for(var/turf/T in turfs)
+ for(var/mob/living/L in T.contents)
+ if(L.client)
+ empty += pick(((RANGE_TURFS(2, L) - RANGE_TURFS(1, L)) & turfs) - empty) // picks a turf within 2 of the creature not outside or in the shield
+ any_attack = 1
+ for(var/obj/mecha/M in T.contents)
+ empty += pick(((RANGE_TURFS(2, M) - RANGE_TURFS(1, M)) & turfs) - empty)
+ any_attack = 1
+ if(!any_attack)
+ for(var/obj/effect/temp_visual/drakewall/D in drakewalls)
+ qdel(D)
+ return 0 // nothing to attack in the arena time for enraged attack if we still have a target
+ for(var/turf/T in turfs)
+ if(!(T in empty))
+ new /obj/effect/temp_visual/lava_warning/hard(T)
+ else if(!istype(T, /turf/closed/indestructible))
+ new /obj/effect/temp_visual/lava_safe(T)
+ amount--
+ sleep(24)
+ return 1 // attack finished completely
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/arena_escape_enrage() // you ran somehow / teleported away from my arena attack now i'm mad fucker
+ sleep(0)
+ SetRecoveryTime(80)
+ visible_message("[src] starts to glow vibrantly as its wounds close up!")
+ adjustBruteLoss(-250) // yeah you're gonna pay for that, don't run nerd
+ add_atom_colour(rgb(255, 255, 0), TEMPORARY_COLOUR_PRIORITY)
+ move_to_delay = move_to_delay / 2
+ light_range = 10
+ sleep(10) // run.
+ mass_fire(20, 15, 3)
+ move_to_delay = initial(move_to_delay)
+ remove_atom_colour(TEMPORARY_COLOUR_PRIORITY)
+ light_range = initial(light_range)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/fire_cone(atom/at = target, meteors = TRUE)
+ playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE)
+ sleep(0)
+ if(prob(50) && meteors)
+ INVOKE_ASYNC(src, .proc/fire_rain)
+ var/range = 15
+ var/list/turfs = list()
+ turfs = line_target(-40, range, at)
+ INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ turfs = line_target(0, range, at)
+ INVOKE_ASYNC(src, .proc/fire_line, turfs)
+ turfs = line_target(40, range, at)
+ INVOKE_ASYNC(src, .proc/fire_line, turfs)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/line_target(offset, range, atom/at = target)
+ if(!at)
+ return
+ var/angle = ATAN2(at.x - src.x, at.y - src.y) + offset
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to range)
+ var/turf/check = locate(src.x + cos(angle) * i, src.y + sin(angle) * i, src.z)
+ if(!check)
+ break
+ T = check
+ return (getline(src, T) - get_turf(src))
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/fire_line(var/list/turfs)
+ sleep(0)
+ dragon_fire_line(src, turfs)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/swooop_attack(lava_arena = FALSE, atom/movable/manual_target, swoop_cooldown = 30)
+ if(stat || swooping)
+ return
+ if(manual_target)
+ target = manual_target
+ if(!target)
+ return
+ stop_automated_movement = TRUE
+ swooping |= SWOOP_DAMAGEABLE
+ density = FALSE
+ icon_state = "shadow"
+ visible_message("[src] swoops up high!")
+
+ var/negative
+ var/initial_x = x
+ if(target.x < initial_x) //if the target's x is lower than ours, swoop to the left
+ negative = TRUE
+ else if(target.x > initial_x)
+ negative = FALSE
+ else if(target.x == initial_x) //if their x is the same, pick a direction
+ negative = prob(50)
+ var/obj/effect/temp_visual/dragon_flight/hard/F = new /obj/effect/temp_visual/dragon_flight/hard(loc, negative)
+
+ negative = !negative //invert it for the swoop down later
+
+ var/oldtransform = transform
+ alpha = 255
+ animate(src, alpha = 204, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING)
+ for(var/i in 1 to 3)
+ sleep(1)
+ if(QDELETED(src) || stat == DEAD) //we got hit and died, rip us
+ qdel(F)
+ if(stat == DEAD)
+ swooping &= ~SWOOP_DAMAGEABLE
+ animate(src, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately
+ return
+ animate(src, alpha = 100, transform = matrix()*0.7, time = 7)
+ swooping |= SWOOP_INVULNERABLE
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ sleep(7)
+
+ while(target && loc != get_turf(target))
+ forceMove(get_step(src, get_dir(src, target)))
+ sleep(0.5)
+
+ // Ash drake flies onto its target and rains fire down upon them
+ var/descentTime = 10
+ var/lava_success = TRUE
+ if(lava_arena)
+ lava_success = lava_arena()
+
+
+ //ensure swoop direction continuity.
+ if(negative)
+ if(ISINRANGE(x, initial_x + 1, initial_x + DRAKE_SWOOP_DIRECTION_CHANGE_RANGE))
+ negative = FALSE
+ else
+ if(ISINRANGE(x, initial_x - DRAKE_SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1))
+ negative = TRUE
+ new /obj/effect/temp_visual/dragon_flight/hard/end(loc, negative)
+ new /obj/effect/temp_visual/dragon_swoop/hard(loc)
+ animate(src, alpha = 255, transform = oldtransform, descentTime)
+ sleep(descentTime)
+ swooping &= ~SWOOP_INVULNERABLE
+ mouse_opacity = initial(mouse_opacity)
+ icon_state = "dragon"
+ playsound(loc, 'sound/effects/meteorimpact.ogg', 200, TRUE)
+ for(var/mob/living/L in orange(1, src))
+ if(L.stat)
+ visible_message("[src] slams down on [L], crushing [L.p_them()]!")
+ L.gib()
+ else
+ L.adjustBruteLoss(75)
+ if(L && !QDELETED(L)) // Some mobs are deleted on death
+ var/throw_dir = get_dir(src, L)
+ if(L.loc == loc)
+ throw_dir = pick(GLOB.alldirs)
+ var/throwtarget = get_edge_target_turf(src, throw_dir)
+ L.throw_at(throwtarget, 3)
+ visible_message("[L] is thrown clear of [src]!")
+ for(var/obj/mecha/M in orange(1, src))
+ M.take_damage(75, BRUTE, "melee", 1)
+
+ for(var/mob/M in range(7, src))
+ shake_camera(M, 15, 1)
+
+ density = TRUE
+ sleep(1)
+ swooping &= ~SWOOP_DAMAGEABLE
+ SetRecoveryTime(swoop_cooldown)
+ if(!lava_success)
+ arena_escape_enrage()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/proc/triple_swooop(lava_arena = FALSE, atom/movable/manual_target, swoop_cooldown = 4)
+ swooop_attack(lava_arena, manual_target, swoop_cooldown)
+ sleep(15)
+ swooop_attack(lava_arena, manual_target, swoop_cooldown)
+ sleep(15)
+ swooop_attack(lava_arena, manual_target, swoop_cooldown)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/ex_act(severity, target)
+ if(severity == EXPLODE_LIGHT)
+ return
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ if(!forced && (swooping & SWOOP_INVULNERABLE))
+ return FALSE
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, mob/target, target_message, user_msg, runechat_popup) //SKYRAT EDIT
+ if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit
+ return
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/AttackingTarget()
+ if(!swooping)
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/DestroySurroundings()
+ if(!swooping)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/Move()
+ if(!swooping)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/hard/Goto(target, delay, minimum_distance)
+ if(!swooping)
+ ..()
+
+/obj/effect/temp_visual/lava_warning/hard
+ icon_state = "lavastaff_warn"
+ layer = BELOW_MOB_LAYER
+ light_range = 2
+ duration = 13
+
+/obj/effect/temp_visual/lava_warning/hard/ex_act()
+ return
+
+/obj/effect/temp_visual/lava_warning/hard/Initialize(mapload, reset_time = 10)
+ . = ..()
+ INVOKE_ASYNC(src, .proc/fall, reset_time)
+ src.alpha = 63.75
+ animate(src, alpha = 255, time = duration)
+
+/obj/effect/temp_visual/lava_warning/hard/fall(var/reset_time)
+ var/turf/T = get_turf(src)
+ playsound(T,'sound/magic/fleshtostone.ogg', 80, TRUE)
+ sleep(duration)
+ playsound(T,'sound/magic/fireball.ogg', 200, TRUE)
+
+ for(var/mob/living/L in T.contents)
+ if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon))
+ continue
+ L.adjustFireLoss(10)
+ to_chat(L, "You fall directly into the pool of lava!")
+
+ // deals damage to mechs
+ for(var/obj/mecha/M in T.contents)
+ M.take_damage(45, BRUTE, "melee", 1)
+
+ // changes turf to lava temporarily
+ if(!istype(T, /turf/closed) && !istype(T, /turf/open/lava))
+ var/lava_turf = /turf/open/lava/smooth
+ var/reset_turf = T.type
+ T.ChangeTurf(lava_turf, flags = CHANGETURF_INHERIT_AIR)
+ addtimer(CALLBACK(T, /turf.proc/ChangeTurf, reset_turf, null, CHANGETURF_INHERIT_AIR), reset_time, TIMER_OVERRIDE|TIMER_UNIQUE)
+
+/obj/effect/temp_visual/drakewall
+ desc = "An ash drakes true flame."
+ name = "Fire Barrier"
+ icon = 'icons/effects/fire.dmi'
+ icon_state = "1"
+ anchored = TRUE
+ opacity = 0
+ density = TRUE
+ CanAtmosPass = ATMOS_PASS_DENSITY
+ duration = 82
+ color = COLOR_DARK_ORANGE
+
+/obj/effect/temp_visual/lava_safe
+ icon = 'icons/obj/hand_of_god_structures.dmi'
+ icon_state = "trap-earth"
+ layer = BELOW_MOB_LAYER
+ light_range = 2
+ duration = 13
+
+/obj/effect/temp_visual/dragon_swoop/hard
+ name = "certain death"
+ desc = "Don't just stand there, move!"
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "landing"
+ layer = BELOW_MOB_LAYER
+ pixel_x = -32
+ pixel_y = -32
+ color = "#FF0000"
+ duration = 10
+
+/obj/effect/temp_visual/dragon_flight/hard
+ icon = 'icons/mob/lavaland/64x64megafauna.dmi'
+ icon_state = "dragon"
+ layer = ABOVE_ALL_MOB_LAYER
+ pixel_x = -16
+ duration = 10
+ randomdir = FALSE
+
+/obj/effect/temp_visual/dragon_flight/hard/Initialize(mapload, negative)
+ . = ..()
+ INVOKE_ASYNC(src, .proc/flight, negative)
+
+/obj/effect/temp_visual/dragon_flight/hard/flight(negative)
+ if(negative)
+ animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT*0.1, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING)
+ else
+ animate(src, pixel_x = DRAKE_SWOOP_HEIGHT*0.1, pixel_z = DRAKE_SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING)
+ sleep(3)
+ icon_state = "swoop"
+ if(negative)
+ animate(src, pixel_x = -DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7)
+ else
+ animate(src, pixel_x = DRAKE_SWOOP_HEIGHT, pixel_z = DRAKE_SWOOP_HEIGHT, time = 7)
+
+/obj/effect/temp_visual/dragon_flight/end
+ pixel_x = DRAKE_SWOOP_HEIGHT
+ pixel_z = DRAKE_SWOOP_HEIGHT
+ duration = 10
+
+/obj/effect/temp_visual/dragon_flight/hard/end/flight(negative)
+ if(negative)
+ pixel_x = -DRAKE_SWOOP_HEIGHT
+ animate(src, pixel_x = -16, pixel_z = 0, time = 5)
+ else
+ animate(src, pixel_x = -16, pixel_z = 0, time = 5)
+
+obj/effect/temp_visual/fireball/hard
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "fireball"
+ name = "fireball"
+ desc = "Get out of the way!"
+ layer = FLY_LAYER
+ randomdir = FALSE
+ duration = 9
+ pixel_z = 270
+
+/obj/effect/temp_visual/fireball/hard/Initialize()
+ . = ..()
+ animate(src, pixel_z = 0, time = duration)
+
+/obj/effect/temp_visual/target/hard
+ icon = 'icons/mob/actions/actions_items.dmi'
+ icon_state = "sniper_zoom"
+ layer = BELOW_MOB_LAYER
+ light_range = 2
+ duration = 9
+
+/obj/effect/temp_visual/target/hard/ex_act()
+ return
+
+/obj/effect/temp_visual/target/hard/Initialize(mapload, list/flame_hit)
+ . = ..()
+ INVOKE_ASYNC(src, .proc/fall, flame_hit)
+
+/obj/effect/temp_visual/target/hard/fall(list/flame_hit)
+ var/turf/T = get_turf(src)
+ playsound(T,'sound/magic/fleshtostone.ogg', 80, TRUE)
+ new /obj/effect/temp_visual/fireball/hard(T)
+ sleep(duration)
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled()
+ playsound(T, "explosion", 80, TRUE)
+ new /obj/effect/hotspot(T)
+ T.hotspot_expose(700, 50, 1)
+ for(var/mob/living/L in T.contents)
+ if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon))
+ continue
+ if(islist(flame_hit) && !flame_hit[L])
+ L.adjustFireLoss(40)
+ to_chat(L, "You're hit by the drake's fire breath!")
+ flame_hit[L] = TRUE
+ else
+ L.adjustFireLoss(10) //if we've already hit them, do way less damage
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm
new file mode 100644
index 0000000000..be492a0896
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/gladiator.dm
@@ -0,0 +1,390 @@
+/* THE GLADIATOR
+* Has 4 special attacks, which are used depending on the phase (the gladiator has 3 phases).
+* AoE Zweihander swing: In a square of 4×4, he swings his sword in a 360 degree arc, damaging anything within it.
+* Shield bash: The gladiator charges and chases you with increased speed for 21 tiles, if he makes contact, he bashes you and knocks you down.
+He will stun himself for up to 2.25 seconds, no matter the result of the charge attack; This leaves him vulnerable for attacks for a few precious moments.
+* Bone daggers: At random times if the player is running, he can throw bone daggers that will go considerably fast in the players direction.
+They deal 35 brute (armor is considered).
+* Additionally, he gets more speedy and aggressive as he raises in phase, at the cost of some special attacks.
+* On phase 1, the gladiator has a 50% block chance for any attack.
+* Loot:
+* Gladiator tower shield - A powerful and indestructible shield, that can also be used as a surfboard.
+* Shielding modkit - A modkit that grants your PKA a 15% chance to block any incoming attack while held.
+* Tomahawk - Basically a one handed crusher to complement the shield.
+*/
+/mob/living/simple_animal/hostile/megafauna/gladiator
+ name = "\proper The Gladiator"
+ desc = "An immortal ash walker, whose powers have been granted by the necropolis itself."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "gladiator1"
+ icon_dead = "gladiator_dying"
+ attack_verb_simple = "slashes"
+ attack_verb_continuous = "slash"
+ attack_sound = 'sandcode/sound/weapons/zweihanderslice.ogg'
+ death_sound = 'sandcode/sound/effects/gladiatordeathsound.ogg'
+ deathmessage = "gets discombobulated and dies."
+ rapid_melee = 1
+ melee_queue_distance = 2
+ melee_damage_lower = 35
+ melee_damage_upper = 35
+ speed = 1
+ move_to_delay = 2.25
+ wander = FALSE
+ var/block_chance = 50
+ ranged = 1
+ ranged_cooldown_time = 30
+ minimum_distance = 1
+ health = 1500
+ maxHealth = 1500
+ movement_type = GROUND
+ weather_immunities = list("lava","ash")
+ var/phase = 1
+ var/list/introduced = list() //Basically all the mobs which the gladiator has already introduced himself to.
+ var/speen = FALSE
+ var/speenrange = 4
+ var/obj/savedloot = null
+ var/charging = FALSE
+ var/chargetiles = 0
+ var/chargerange = 21
+ var/stunned = FALSE
+ var/stunduration = 15
+ var/move_to_charge = 1.5
+ loot = list(/obj/structure/closet/crate/necropolis/gladiator)
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/gladiator/crusher)
+ glorymessageshand = list("grabs the gladiator's arm, flips their zweihander with the other hand, and forcefully makes them chop off their own head with it!", "grabs the gladiator by their zweihander, and mark detonate them into a shower of gibs!", "rips out both of the gladiator's arms, then kicks their limp torso on the groundd and curbstomps their head in so hard it explodes!")
+ glorymessagescrusher = list("chops off gladiator's zweihandder arm in one swift move, then grabs the zweihander and swings it against their head, chopping their skull vertically in half!", "bashes the gladiator to the ground with the hilt of their crusher, then elbow drops their skull so hard it explodes in gore!", "chops the gladiator diagonally with their crusher, not quite cutting through but getting their crusher halfway stuck and killing the screaming fiend!")
+ glorymessagespka = list("grabs the gladiator by the neck and flips them, shooting through their guts with a PKA blast!", "shoots at the gladiator's shoulder, exploding their arm! To finish the fiend off, they grab their PKA and bonk the gladiator's head inside their torso!", "doesn't bother with being fancy, and simply shoots at the gladiator's head with their PKA, exploding it in one violent blast!")
+ glorymessagespkabayonet = list("rams into the gladiator's stomach with their PKA's bayonet, knocking them and themselves down! To finish the fiend off, they simply stab into their torso like a madman with their bayonet!", "kicks the gladiator's knee hard, breaking it! While the fiend is stunned and barely standing, their chop their head off with the PKA's bayonet!")
+ glorythreshold = 50
+ weather_immunities = list("lava","ash")
+
+/obj/item/gps/internal/gladiator
+ icon_state = null
+ gpstag = "Dreadful Signal"
+ desc = "Let me help you to see, miner."
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/Initialize(mapload)
+ . = ..()
+ internal = new /obj/item/gps/internal/gladiator(src)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/Life()
+ . = ..()
+ if(!wander)
+ for(var/mob/living/M in view(4, src))
+ if(!(M in introduced) && (stat != DEAD))
+ introduction(M)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/apply_damage(damage, damagetype, def_zone, blocked, forced, bare_wound_bonus = FALSE, sharpness = FALSE, wound_bonus=CANT_WOUND)
+ if(speen)
+ visible_message("[src] brushes off all incoming attacks!")
+ return FALSE
+ else if(prob(50) && (phase == 1) && !stunned)
+ visible_message("[src] blocks all incoming damage with his shield!")
+ return FALSE
+ ..()
+ update_phase()
+ var/adjustment_amount = min(damage * 0.15, 15)
+ if(world.time + adjustment_amount > next_move)
+ changeNext_move(adjustment_amount)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/Retaliate()
+ . = ..()
+ if(!wander)
+ wander = TRUE
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/introduction(mob/living/target)
+ if(src == target)
+ introduced += src
+ return
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ var/datum/species/Hspecies = H.dna.species
+ if(Hspecies.id == "ashlizard")
+ var/list/messages = list("I am sorry, tribesssmate. I cannot let you through.",\
+ "Pleassse leave, walker.",\
+ "The necropolisss must be protected even from it'ss servants. Pleassse retreat.")
+ say(message = pick(messages), language = /datum/language/draconic)
+ introduced |= H
+ else if(Hspecies.id == "lizard")
+ var/list/messages = list("Thisss isss not the time nor place to be. Leave.",\
+ "Go back where you came from. I am sssafeguarding thisss sssacred place.",\
+ "You ssshould not be here. Turn.",\
+ "I can sssee an outlander from a mile away. You're not one of us."\
+ )
+ say(message = pick(messages), language = /datum/language/draconic)
+ introduced |= H
+ else if(Hspecies.id == "dunmer")
+ var/list/messages = list("I will finisssh what little of your race remainsss, starting with you!",\
+ "Lavaland belongsss to the lizzzards!",\
+ "Thisss sacred land wasn't your property before, it won't be now!")
+ say(message = pick(messages))
+ introduced |= H
+ GiveTarget(H)
+ Retaliate()
+ else
+ var/list/messages = list("Get out of my sssight, outlander.",\
+ "You will not run your dirty handsss through what little sssacred land we have left. Out.",\
+ "My urge to end your life isss immeasssurable, but I am willing to ssspare you. Leave.",\
+ "You're not invited. Get out.")
+ say(message = pick(messages))
+ introduced |= H
+
+ else
+ say("You are not welcome into the necropolisss.")
+ introduced |= target
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/Move(atom/newloc, dir, step_x, step_y)
+ if(speen || stunned)
+ return FALSE
+ else
+ if(ischasm(newloc))
+ var/list/possiblelocs = list()
+ switch(dir)
+ if(NORTH)
+ possiblelocs += locate(x +1, y + 1, z)
+ possiblelocs += locate(x -1, y + 1, z)
+ if(EAST)
+ possiblelocs += locate(x + 1, y + 1, z)
+ possiblelocs += locate(x + 1, y - 1, z)
+ if(WEST)
+ possiblelocs += locate(x - 1, y + 1, z)
+ possiblelocs += locate(x - 1, y - 1, z)
+ if(SOUTH)
+ possiblelocs += locate(x - 1, y - 1, z)
+ possiblelocs += locate(x + 1, y - 1, z)
+ if(SOUTHEAST)
+ possiblelocs += locate(x + 1, y, z)
+ possiblelocs += locate(x + 1, y + 1, z)
+ if(SOUTHWEST)
+ possiblelocs += locate(x - 1, y, z)
+ possiblelocs += locate(x - 1, y + 1, z)
+ if(NORTHWEST)
+ possiblelocs += locate(x - 1, y, z)
+ possiblelocs += locate(x - 1, y - 1, z)
+ if(NORTHEAST)
+ possiblelocs += locate(x + 1, y - 1, z)
+ possiblelocs += locate(x + 1, y, z)
+ for(var/turf/T in possiblelocs)
+ if(ischasm(T))
+ possiblelocs -= T
+ if(possiblelocs.len)
+ var/turf/validloc = pick(possiblelocs)
+ if(charging)
+ chargetiles++
+ if(chargetiles >= chargerange)
+ discharge()
+ return ..(validloc)
+ return FALSE
+ else
+ if(charging)
+ chargetiles++
+ if(chargetiles >= chargerange)
+ discharge()
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/Bump(atom/A)
+ . = ..()
+ if(charging)
+ if(isliving(A))
+ var/mob/living/LM = A
+ forceMove(LM.loc)
+ visible_message("[src] knocks [LM] down!")
+ LM.DefaultCombatKnockdown(60)
+ discharge()
+ else if(istype(A, /turf/closed))
+ visible_message("[src] crashes headfirst into [A]!")
+ discharge(1.33)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/update_phase()
+ var/healthpercentage = 100 * (health/maxHealth)
+ if(src.stat == DEAD)
+ return
+ switch(healthpercentage)
+ if(75 to 100)
+ phase = 1
+ rapid_melee = initial(rapid_melee)
+ move_to_delay = initial(move_to_delay)
+ melee_damage_upper = initial(melee_damage_upper)
+ melee_damage_lower = initial(melee_damage_lower)
+ if(30 to 75)
+ phase = 2
+ icon_state = "gladiator2"
+ rapid_melee = 2
+ move_to_delay = 2
+ melee_damage_upper = 30
+ melee_damage_lower = 30
+ if(0 to 30)
+ phase = 3
+ icon_state = "gladiator3"
+ rapid_melee = 4
+ melee_damage_upper = 25
+ melee_damage_lower = 25
+ move_to_delay = 1.7
+ if(charging)
+ move_to_delay = move_to_charge
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/zweispin()
+ visible_message("[src] lifts his zweihander, and prepares to spin!")
+ speen = TRUE
+ animate(src, color = "#ff6666", 10)
+ sleep(5)
+ var/list/speenturfs = list()
+ var/list/temp = (view(speenrange, src) - view(speenrange-1, src))
+ speenturfs.len = temp.len
+ var/woop = FALSE
+ var/start = 0
+ for(var/i in 0 to speenrange)
+ speenturfs[1+i] = locate(x - i, y - speenrange, z)
+ start = i
+ for(var/i in 1 to (speenrange*2))
+ var/turf/T = speenturfs[start]
+ speenturfs[start+i] = locate(T.x, T.y + i, T.z)
+ if(i == (speenrange*2))
+ start = (start+i)
+ for(var/i in 1 to (speenrange*2))
+ var/turf/T = speenturfs[start]
+ speenturfs[start+i] = locate(T.x + i, T.y, T.z)
+ if(i == (speenrange*2))
+ start = (start+i)
+ for(var/i in 1 to (speenrange*2))
+ var/turf/T = speenturfs[start]
+ speenturfs[start+i] = locate(T.x, T.y - i, T.z)
+ if(i == (speenrange*2))
+ start = (start+i)
+ for(var/i in 1 to speenrange)
+ var/turf/T = speenturfs[start]
+ speenturfs[start+i] = locate(T.x - i, T.y, T.z)
+ var/list/hit_things = list()
+ for(var/turf/T in speenturfs)
+ src.dir = get_dir(src, T)
+ for(var/turf/U in (getline(src, T) - get_turf(src)))
+ var/obj/effect/temp_visual/small_smoke/smonk = new /obj/effect/temp_visual/small_smoke(U)
+ QDEL_IN(smonk, 1.25)
+ for(var/mob/living/M in U)
+ if(!faction_check(faction, M.faction) && !(M in hit_things))
+ playsound(src, 'sound/weapons/slash.ogg', 75, 0)
+ if(M.apply_damage(40, BRUTE, BODY_ZONE_CHEST))
+ visible_message("[src] slashes [M] with his spinning zweihander!")
+ else
+ visible_message("[src]'s spinning zweihander is stopped by [M]!")
+ woop = TRUE
+ hit_things += M
+ if(woop)
+ break
+ sleep(1.25)
+ animate(src, color = initial(color), 3)
+ sleep(3)
+ speen = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/chargeattack(atom/target, var/range)
+ face_atom(target)
+ visible_message("[src] lifts his shield, and prepares to charge!")
+ animate(src, color = "#ff6666", 3)
+ sleep(4)
+ face_atom(target)
+ move_to_delay = move_to_charge
+ minimum_distance = 0
+ charging = TRUE
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/discharge(var/modifier = 1)
+ stunned = TRUE
+ charging = FALSE
+ minimum_distance = 1
+ chargetiles = 0
+ animate(src, color = initial(color), 7)
+ update_phase()
+ sleep(stunduration * modifier)
+ stunned = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/teleport(atom/target)
+ var/turf/T = get_step(target, -target.dir)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(src))
+ sleep(4)
+ if(!ischasm(T) && !(/mob/living in T))
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ forceMove(T)
+ else
+ var/list/possiblelocs = (view(3, target) - view(1, target))
+ for(var/atom/A in possiblelocs)
+ if(!isturf(A))
+ possiblelocs -= A
+ else
+ if(ischasm(A) || istype(A, /turf/closed) || (/mob/living in A))
+ possiblelocs -= A
+ if(possiblelocs.len)
+ T = pick(possiblelocs)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ forceMove(T)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/AttackingTarget()
+ . = ..()
+ if(speen || stunned)
+ return FALSE
+ if(charging)
+ Bump(target)
+ if(. && prob(5 * phase))
+ teleport(target)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/proc/boneappletea(atom/target)
+ var/obj/item/kitchen/knife/combat/bone/boned = new /obj/item/kitchen/knife/combat/bone(get_turf(src))
+ boned.throwforce = 35
+ playsound(src, 'sound/weapons/fwoosh.wav', 60, 0)
+ boned.throw_at(target, 7, 3, src)
+ QDEL_IN(boned, 30)
+
+/mob/living/simple_animal/hostile/megafauna/gladiator/OpenFire()
+ if(world.time < ranged_cooldown)
+ return FALSE
+ if(speen || stunned || charging)
+ return FALSE
+ ranged_cooldown = world.time
+ switch(phase)
+ if(1)
+ if(prob(25) && (get_dist(src, target) <= 4))
+ zweispin()
+ ranged_cooldown += 70
+ else
+ if(prob(66))
+ chargeattack(target, 21)
+ ranged_cooldown += 40
+ else
+ teleport(target)
+ ranged_cooldown += 35
+ if(2)
+ if(prob(40) && (get_dist(src, target) <= 4))
+ zweispin()
+ ranged_cooldown += 55
+ else
+ if(prob(40))
+ boneappletea(target)
+ ranged_cooldown += 35
+ else
+ teleport(target)
+ ranged_cooldown += 30
+ if(3)
+ if(prob(35))
+ boneappletea(target)
+ ranged_cooldown += 30
+ else
+ teleport(target)
+ ranged_cooldown += 20
+
+//Aggression helpers
+/obj/effect/step_trigger/gladiator
+ var/mob/living/simple_animal/hostile/megafauna/gladiator/glady
+
+/obj/effect/step_trigger/gladiator/Initialize()
+ . = ..()
+ for(var/mob/living/simple_animal/hostile/megafauna/gladiator/G in view(7, src))
+ if(!glady)
+ glady = G
+
+/obj/effect/step_trigger/gladiator/Trigger(atom/movable/A)
+ if(isliving(A))
+ var/mob/living/bruh = A
+ glady.enemies |= bruh
+ glady.GiveTarget(bruh)
+ for(var/obj/effect/step_trigger/gladiator/glad in view(7, src))
+ qdel(glad)
+ return TRUE
+ return FALSE
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm
new file mode 100644
index 0000000000..06d8cf586a
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/glaurung.dm
@@ -0,0 +1,116 @@
+/*
+
+GLAURUNG
+
+Glaurung is a special Ash Drake for admemery roleplay. It's distinguishing features are the name, description, and the glowing blue eyes.
+
+When not controlled by a player, it acts as a normal ashdrake, but with various changes.
+
+Whenever possible, the drake will breathe fire in the direction it faces, igniting and heavily damaging anything caught in the blast.
+It also often causes fire to rain from the sky - many nearby turfs will flash red as a fireball crashes into them, dealing damage to anything on the turfs.
+Glaurung is unable to fly due to excess years of damage to its wings, but it is much faster on its legs.
+
+When an ash drake dies, it leaves behind a chest that can contain four things:
+ 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power
+ 2. A lava staff that allows its wielder to create lava
+ 3. A spellbook and wand of fireballs
+ 4. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves.
+
+When butchered, they leave behind diamonds, sinew, bone, and ash drake hide. Ash drake hide can be used to create a hooded cloak that protects its wearer from ash storms.
+
+Difficulty: Medium
+
+*/
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung
+ name = "Glaurung"
+ desc = "An ancient Ash Drake untouched except for age. It's eyes glow a soft blue color as opposed to a regular yellow. It carries itself with more strength than the standard drake, eyeing those who come near with caution. Perhaps it is smarter and capable of speech?"
+ threat = 5
+ health = 2000
+ maxHealth = 2000
+ spacewalk = TRUE
+ initial_language_holder = /datum/language_holder/dragon
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+ sight = SEE_TURFS|SEE_MOBS|SEE_OBJS
+ attack_verb_continuous = "chomps"
+ attack_verb_simple = "chomp"
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ icon = 'sandcode/icons/mob/lavaland/glaurung.dmi'
+ icon_state = "glaurung"
+ icon_living = "glaurung"
+ icon_dead = "glaurung_dead"
+ friendly_verb_continuous = "stares down"
+ friendly_verb_simple = "stare down"
+ speak_emote = list("roars")
+ armour_penetration = 45
+ melee_damage_lower = 20
+ melee_damage_upper = 40
+ speed = 1
+ move_to_delay = 4
+ ranged = 1
+ pixel_x = -16
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/glaurung/crusher)
+ loot = list(/obj/structure/closet/crate/necropolis/glaurung)
+ butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
+ guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/ashdrake = 10)
+ medal_type = BOSS_MEDAL_DRAKE
+ score_type = DRAKE_SCORE
+ deathmessage = "collapses into a pile of bones, its flesh sloughing away."
+ death_sound = 'sound/magic/demon_dies.ogg'
+ songs = null
+ move_force = MOVE_FORCE_NORMAL
+ move_resist = MOVE_FORCE_NORMAL
+ pull_force = MOVE_FORCE_NORMAL
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/Initialize()
+ smallsprite.Grant(src)
+ . = ..()
+ internal = new/obj/item/gps/internal/glaurung(src)
+
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/proc/line_target(offset, range, atom/at = target)
+ if(!at)
+ return
+ var/angle = ATAN2(at.x - src.x, at.y - src.y) + offset
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to range)
+ var/turf/check = locate(src.x + cos(angle) * i, src.y + sin(angle) * i, src.z)
+ if(!check)
+ break
+ T = check
+ return (getline(src, T) - get_turf(src))
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/proc/fire_line(var/list/turfs)
+ sleep(0)
+ dragon_fire_line(src, turfs)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/proc/fire_stream(var/atom/at = target)
+ playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE)
+ sleep(0)
+ var/range = 20
+ var/list/turfs = list()
+ turfs = line_target(0, range, at)
+ INVOKE_ASYNC(src, .proc/fire_line, turfs)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/OpenFire()
+ if(swooping)
+ return
+ ranged_cooldown = world.time + ranged_cooldown_time
+ fire_stream()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/triple_swoop()
+ return null
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/swoop_attack(fire_rain, atom/movable/manual_target, swoop_duration = 40)
+ return null
+
+/mob/living/simple_animal/hostile/megafauna/dragon/glaurung/AltClickOn(atom/movable/A)
+ if(!istype(A))
+ to_chat(src, "Your wings are too damaged for old swoop maneuvers.")
+ return
+
+/obj/item/gps/internal/glaurung
+ icon_state = null
+ gpstag = "Wise Signal"
+ desc = "Something ancient lies this way."
+ invisibility = 100
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
new file mode 100644
index 0000000000..926c13971c
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -0,0 +1,8 @@
+/mob/living/simple_animal/hostile/megafauna/hierophant
+ loot = list(/obj/item/hierophant_club, /obj/item/borg/upgrade/modkit/wall)
+ crusher_loot = list(/obj/item/hierophant_club, /obj/item/borg/upgrade/modkit/wall)
+ songs = list("2610" = sound(file = 'sandcode/sound/ambience/dummyremix.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC), "1680" = sound(file = 'sandcode/sound/ambience/rollermobster.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) //Dummy originally made by Toby Fox, remix by Emsdache. Roller Mobster by Carpenter Brut.
+ glorymessageshand = list("grabs the floating club by the hilt, and violently smashes it onto the ground, killing it!", "jumps onto the hierophant and rips off their beacon with one hand as it crackles and explodes!")
+ glorymessagescrusher = list("violently chops the floating club with seemingly no effect, until it falls onto the ground limply!")
+ glorymessagespka = list("shoots at the floating club in the middle of it's 'face', which seemingly overloads it until it explodes!")
+ glorymessagespkabayonet = list("jumps on the hierophant and stabs it's beacon, the bizarre creature seemingly screaming until it crackles and explodes!")
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm
new file mode 100644
index 0000000000..04dc21aab7
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/king_of_goats.dm
@@ -0,0 +1,333 @@
+/*
+KING OF GOATS
+The king of goat is inside a 9x9 arena protected by two guards while during stage one it is generally a cake walk the later stages however can prove extremely challenging and downright impossible for less skilled miners..
+The king goat is as indicated by his name the king of all goats and as such if you attempt to fight him you will learn why he is the king in the first place...
+It has no ranged attacks what so ever but makes up for it by being confined in a small space and having the ability to summon guards, charge at his enemy and do a aoe explosion attack which can prove devistating for most miners.
+The three stages of the king goat:
+ Stage 1: The king goat is pretty much just a slightly more robust regular goat, the king will proceed to charge at you full force in the hopes of taking you out easily but can be easily defeated by even a unexperienced miner.
+ Stage 2: This is where things start heating up. At this stage the king goat will become slightly larger and start doing special attacks which range from summoning guards to come to his aid to stomping his hooves on the ground causing the arena to shake and a aoe explosion to appear around him most miners do not make it pass this stage but if you do...
+ Stage 3: Oh boy your in for it now at this stage the king goat will completly heal and grow slightly bigger and start glowing it has the exact same attacks as stage 2 but is much more intimidating if you can defeat him at stage three he will fall over dead on the ground and drop a ladder so you may now leave the arena but dont forget to grab the loot first!
+The loot:
+The goat gun: This weapon as the name implies fires goats at your enemies knocking them down and doing a bit of brute damage it self recharges and combined with the goat pope hat or king goat pelt can lead to some interesting shenigans,
+The king goat pelt: Hope you brought a knife cause your gonna need to butcher the king goats corpse to get this prize. Once you butcher the king goat you can grab his pelt and wear it on your head as armor, boasting decent bomb resistance and slightly better gun and laser resistance then the drake helm at the cost of slightly reduced melee protection this is THE prize to show who the king of lavaland really is around here! Also makes goats friendly towards you as long as you are wearing it for they will see you as their new king.
+Difficulty: Insanely Hard
+*/
+
+//Visager's tracks 'Battle!' and 'Miniboss Fight' from the album 'Songs from an Unmade World 2' are available here
+//http://freemusicarchive.org/music/Visager/Songs_From_An_Unmade_World_2/ and are made available under the CC BY 4.0 Attribution license,
+//which is available for viewing here: https://creativecommons.org/licenses/by/4.0/legalcode
+
+
+//the king and his court
+/mob/living/simple_animal/hostile/megafauna/king
+ name = "king of the goats"
+ desc = "The oldest and wisest of the goats. King of his race, peerless in dignity and power. His golden fleece radiates nobility."
+ icon = 'sandcode/icons/mob/king_of_goats.dmi'
+ icon_state = "king_goat"
+ icon_living = "king_goat"
+ icon_dead = "king_goat_dead"
+ faction = list("goat_king")
+ speak = list("EHEHEHEHEH","eh?")
+ speak_chance = 1
+ attack_same = FALSE
+ speak_emote = list("brays in a booming voice")
+ emote_hear = list("brays in a booming voice")
+ emote_see = list("stamps a mighty foot, shaking the surroundings")
+ response_help_continuous = "placates"
+ response_help_simple = "placate"
+ response_harm_continuous = "assaults"
+ response_harm_simple = "assault"
+ attack_sound = 'sound/weapons/punch1.ogg'
+ health = 500
+ a_intent = INTENT_HARM
+ sentience_type = SENTIENCE_BOSS
+ stat_attack = DEAD
+ wander = FALSE
+ movement_type = GROUND
+ maxHealth = 500
+ armour_penetration = 35
+ melee_damage_lower = 35
+ melee_damage_upper = 55
+ minbodytemp = 0
+ maxbodytemp = INFINITY
+ obj_damage = 400
+ vision_range = 5
+ aggro_vision_range = 18
+ robust_searching = TRUE
+ move_to_delay = 3
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ var/stun_chance = 5 //chance per attack to Weaken target
+ glorymessageshand = list("grabs the goat by it's horns, then repeatedly knees it in the face until it's skull cracks open and it fucking dies!", "rips off one of the goat's horns bare-handed, then stabs through their skull with it, killing it!")
+ glorymessagescrusher = list("slashes both of the goat's horns with their crusher, then chops it's face in half with it!")
+ glorymessagespka = list("shoots at goat's maw, the goat seemingly gulping down the blast and exploding!", "kicks the goat into the air, then shoots it in the gut with their PKA's blast, showering everything in... goat guts!")
+ glorymessagespkabayonet = list("repeatedly stabs through the goat's eye and skull with their PKAA's bayonet, until it finally gives up and lets go of their life!")
+ gloryhealth = 50
+ glorythreshold = 50
+ crusher_loot = list(/obj/item/crusher_trophy/king_goat)
+
+/mob/living/simple_animal/hostile/megafauna/king/ex_act(severity, target)
+ switch (severity)
+ if (1)
+ adjustBruteLoss(100)
+
+ if (2)
+ adjustBruteLoss(50)
+
+ if(3)
+ adjustBruteLoss(25)
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2
+ name = "emperor of the goats"
+ desc = "The King of Kings, God amongst men, and your superior in every way."
+ icon_state = "king_goat2"
+ icon_living = "king_goat2"
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4, /obj/item/clothing/head/goatpelt/king = 1)
+ health = 750
+ maxHealth = 750
+ armour_penetration = 50
+ melee_damage_lower = 40
+ melee_damage_upper = 60
+ environment_smash = ENVIRONMENT_SMASH_RWALLS
+ pixel_y = 5
+
+ var/spellscast = 0
+ var/phase3 = FALSE
+ var/sound_id = "goat"
+ var/special_attacks = 0
+ var/list/rangers = list()
+ var/current_song = 'sandcode/sound/ambience/Visager-Battle.ogg'
+ var/current_song_length = 1200
+ stun_chance = 7
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/Initialize()
+ . = ..()
+ update_icon()
+
+/mob/living/simple_animal/hostile/megafauna/king/Found(atom/A)
+ if(isliving(A))
+ return A
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/goat/guard/Found(atom/A)
+ if(isliving(A))
+ return A
+ return ..()
+
+/mob/living/simple_animal/hostile/retaliate/goat/guard
+ name = "honour guard"
+ desc = "A very handsome and noble beast."
+ icon = 'sandcode/icons/mob/king_of_goats.dmi'
+ icon_state = "goat_guard"
+ icon_living = "goat_guard"
+ icon_dead = "goat_guard_dead"
+ faction = list("goat_king")
+ attack_same = FALSE
+ sentience_type = SENTIENCE_BOSS
+ stat_attack = DEAD
+ wander = FALSE
+ robust_searching = TRUE
+ health = 125
+ maxHealth = 125
+ minbodytemp = 0
+ maxbodytemp = INFINITY
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ armour_penetration = 10
+ melee_damage_lower = 10
+ melee_damage_upper = 15
+
+/mob/living/simple_animal/hostile/retaliate/goat/guard/master
+ name = "master of the guard"
+ desc = "A very handsome and noble beast - the most trusted of all the king's men."
+ icon_state = "goat_guard_m"
+ icon_living = "goat_guard_m"
+ icon_dead = "goat_guard_m_dead"
+ health = 200
+ maxHealth = 200
+ armour_penetration = 15
+ melee_damage_lower = 15
+ melee_damage_upper = 20
+ move_to_delay = 3
+
+/mob/living/simple_animal/hostile/retaliate/goat/guard/pope
+ name = "Goat Pope"
+ desc = "For what is a God without a pope to spread their holy words"
+ icon_state = "goat_pope"
+ icon_living = "goat_pope"
+ icon_dead = "goat_pope_dead"
+ health = 100
+ maxHealth = 100
+ armour_penetration = 25
+ melee_damage_lower = 25
+ melee_damage_upper = 30
+ move_to_delay = 3
+ loot = list(/obj/item/clothing/head/goatpope)
+
+/mob/living/simple_animal/hostile/megafauna/king/Retaliate()
+ ..()
+ if(stat == CONSCIOUS && prob(5))
+ visible_message("\The [src] bellows indignantly, with a judgemental gleam in his eye.")
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/Retaliate()
+ set waitfor = FALSE
+ ..()
+ if(spellscast < 5)
+ if(prob(5) && move_to_delay >= 3) //speed buff
+ spellscast++
+ visible_message("\The [src] shimmers and seems to phase in and out of reality itself!")
+ move_to_delay = 1
+
+ else if(prob(5) && melee_damage_lower != 50) //damage buff
+ spellscast++
+ visible_message("\The [src]' horns grow larger and more menacing!")
+ melee_damage_lower = 50
+ else if(prob(5)) //spawn adds
+ spellscast++
+ visible_message("\The [src] summons the imperial guard to his aid, and they appear in a flash!")
+ var/mob/living/simple_animal/hostile/retaliate/goat/guard/master/M = new(get_step(src,pick(GLOB.cardinals)))
+ M.enemies |= enemies
+ var/mob/living/simple_animal/hostile/retaliate/goat/guard/G = new(get_step(src,pick(GLOB.cardinals)))
+ G.enemies |= enemies
+ G = new(get_step(src,pick(GLOB.cardinals)))
+ G.enemies |= enemies
+
+ else if(prob(5)) //EMP blast
+ spellscast++
+ visible_message("\The [src] disrupts nearby electrical equipment!")
+ empulse(get_turf(src), 5, 2, 0)
+
+ else if(prob(5) && melee_damage_type == BRUTE && !special_attacks) //elemental attacks
+ spellscast++
+ visible_message("\The [src]' horns flicker with holy white flames!")
+ melee_damage_type = BURN
+
+ else if(prob(5)) //earthquake spell
+ visible_message("\The [src]' eyes begin to glow ominously as dust and debris in the area is kicked up in a light breeze!!")
+ stop_automated_movement = TRUE
+ if(do_after(src, 6 SECONDS, src))
+ var/health_holder = getBruteLoss()
+ visible_message("\The [src] raises its fore-hooves and stomps them into the ground with incredible force!!")
+ explosion(get_step(src,pick(GLOB.cardinals)), -1, 2, 2, 3, 6)
+ explosion(get_step(src,pick(GLOB.cardinals)), -1, 1, 4, 4, 6)
+ explosion(get_step(src,pick(GLOB.cardinals)), -1, 3, 4, 3, 6)
+ stop_automated_movement = FALSE
+ spellscast++
+ if(!(getBruteLoss() > health_holder))
+ adjustBruteLoss(health_holder - getBruteLoss()) //our own magicks cannot harm us
+ else
+ visible_message("\The [src] loses concentration and huffs haughtily.")
+ stop_automated_movement = FALSE
+
+ else return
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/proc/phase3_transition()
+ phase3 = TRUE
+ spellscast = 0
+ maxHealth = 750
+ revive(TRUE)
+ current_song = 'sandcode/sound/ambience/Visager-Miniboss_Fight.ogg'
+ current_song_length = 1759
+ var/sound/song_played = sound(current_song)
+ for(var/mob/M in rangers)
+ if(!M.client || !(M.client.prefs.toggles & SOUND_BOSS_MUSIC))
+ continue
+ M.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ rangers[M] = world.time + current_song_length
+ M.playsound_local(null, null, 30, channel = CHANNEL_BOSSMUSIC, S = song_played)
+ stun_chance = 10
+ update_icon()
+ visible_message("\The [src]' wounds close with a flash, and when he emerges, he's even larger than before!")
+
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/update_icon()
+ var/matrix/M = new
+ if(phase3)
+ icon_state = "king_goat3"
+ icon_living = "king_goat3"
+ M.Scale(1.5)
+ else
+ M.Scale(1.25)
+ transform = M
+ pixel_y = 10
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/Life()
+ . = ..()
+ if(stat != DEAD)
+ var/sound/song_played = sound(current_song)
+
+ for(var/mob/M in range(10, src))
+ if(!M.client || !(M.client.prefs.toggles & SOUND_BOSS_MUSIC))
+ continue
+ if(!(M in rangers) || world.time > rangers[M])
+ M.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ rangers[M] = world.time + current_song_length
+ M.playsound_local(null, null, 30, channel = CHANNEL_BOSSMUSIC, S = song_played)
+ for(var/mob/L in rangers)
+ if(get_dist(src, L) > 10)
+ rangers -= L
+ if(!L || !L.client)
+ continue
+ L.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ else
+ for(var/mob/L in rangers)
+ rangers -= L
+ if(!L || !L.client)
+ continue
+ L.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ if(move_to_delay < 3)
+ move_to_delay += 0.2
+ if(!phase3 && ((health <= 150 && spellscast == 5) || stat == DEAD)) //begin phase 3, reset spell limit and heal
+ phase3_transition()
+ if(!.)
+ return FALSE
+ if(special_attacks >= 5 && melee_damage_type != BRUTE)
+ visible_message("The energy surrounding \the [src]'s horns dissipates.")
+ melee_damage_type = BRUTE
+ if(special_attacks >= 5 && melee_damage_lower == 50)
+ visible_message("The [src]' horns shrink back down to normal size.")
+ melee_damage_lower = 40
+
+/mob/living/simple_animal/hostile/megafauna/king/proc/OnDeath()
+ visible_message("\The [src] lets loose a terrific wail as its wounds close shut with a flash of light, and its eyes glow even brighter than before!")
+ new /mob/living/simple_animal/hostile/megafauna/king/phase2(get_turf(src))
+ qdel(src)
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/OnDeath()
+ for(var/mob/L in rangers)
+ rangers -= L
+ if(!L || !L.client)
+ continue
+ L.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ if(phase3)
+ visible_message("\The [src] shrieks as the seal on his power breaks and he starts to break apart!")
+ new /obj/structure/ladder/unbreakable/goat(loc)
+ new /obj/item/gun/energy/goatgun(loc)
+ new /obj/item/toy/plush/goatplushie/angry/kinggoat(loc) //If someone dies from this after beating the king goat im going to laugh
+
+/mob/living/simple_animal/hostile/megafauna/king/death()
+ ..()
+ OnDeath()
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/Destroy()
+ for(var/mob/L in rangers)
+ rangers -= L
+ if(!L || !L.client)
+ continue
+ L.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ . = ..()
+
+/mob/living/simple_animal/hostile/megafauna/king/AttackingTarget()
+ . = ..()
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat == DEAD)
+ L.gib()
+ if(prob(stun_chance))
+ L.Stun(5)
+ visible_message("\The [L] is bowled over by the impact of [src]'s attack!")
+
+/mob/living/simple_animal/hostile/megafauna/king/phase2/AttackingTarget()
+ . = ..()
+ if(isliving(target))
+ if(melee_damage_type != BRUTE)
+ special_attacks++
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
new file mode 100644
index 0000000000..6ee3978af6
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -0,0 +1,49 @@
+/mob/living/simple_animal/hostile/megafauna/legion
+ loot = list(/obj/item/stack/sheet/bone = 3)
+ songs = list("3550" = sound(file = 'sandcode/sound/ambience/mastermind.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC), "1360" = sound(file = 'sandcode/sound/ambience/terrariaboss1.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC), "1560" = sound('sandcode/sound/ambience/megalovania.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) //Threading on some lines here with the DOOM 16 OST. But terraria should be fine, megalovania too.
+ glorymessageshand = list("punches into the Legion's maw and rips off a floating skull, which they then proceed to use to bash the Legion until it dies!", "punches through both of the Legion's eyeholes with both hands, ripping out a bunch of tiny skulls and killing it!")
+ glorymessagescrusher = list("slashes the Legion's maw, which falls on the ground as it dies!")
+ glorymessagespka = list("parries a floating legion skulls with a pka shoot, which goes flying violently into the Legion, bursting through them and killing them in the process!")
+ glorymessagespkabayonet = list("repeatedly stabs through the Legion's eyesocket, pulling out a bunch of dead skulls in the process and killing it!")
+ glorythreshold = 50
+
+/mob/living/simple_animal/hostile/megafauna/legion/death()
+ if(health > 0)
+ return
+ if(size > 1)
+ adjustHealth(-maxHealth) //heal ourself to full in prep for splitting
+ var/mob/living/simple_animal/hostile/megafauna/legion/L = new(loc)
+
+ L.maxHealth = round(maxHealth * 0.6,DAMAGE_PRECISION)
+ maxHealth = L.maxHealth
+
+ L.health = L.maxHealth
+ health = maxHealth
+
+ size--
+ L.size = size
+
+ L.resize = L.size * 0.2
+ transform = initial(transform)
+ resize = size * 0.2
+
+ L.update_transform()
+ update_transform()
+
+ L.faction = faction.Copy()
+
+ L.GiveTarget(target)
+
+ visible_message("[src] splits in twain!")
+ else
+ var/last_legion = TRUE
+ for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_living_list)
+ if(other != src)
+ last_legion = FALSE
+ break
+ if(last_legion)
+ loot = list(/obj/structure/closet/crate/necropolis/tendril/legion_loot)
+ elimination = 0
+ else if(prob(20))
+ loot = list(/obj/structure/closet/crate/necropolis/tendril)
+ ..()
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/legionhard.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/legionhard.dm
new file mode 100644
index 0000000000..43b3e4644c
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/legionhard.dm
@@ -0,0 +1,293 @@
+/**
+ *LEGION
+ *
+ *Legion spawns from the necropolis gate in the far north of lavaland. It is the guardian of the Necropolis and emerges from within whenever an intruder tries to enter through its gate.
+ *Whenever Legion emerges, everything in lavaland will receive a notice via color, audio, and text. This is because Legion is powerful enough to slaughter the entirety of lavaland with little effort. LOL
+ *
+ *It has three attacks.
+ *Spawn Skull. Most of the time it will use this attack. Spawns a single legion skull.
+ *Spawn Sentinel. The legion will spawn up to three sentinels, depending on its size.
+ *CHARGE! The legion starts spinning and tries to melee the player. It will try to flick itself towards the player, dealing some damage if it hits.
+ *
+ *When Legion dies, it will split into three smaller skulls up to three times.
+ *If you kill all of the smaller ones it drops a staff of storms, which allows its wielder to call and disperse ash storms at will and functions as a powerful melee weapon.
+ *
+ *Difficulty: Medium
+ *
+ *SHITCODE AHEAD. BE ADVISED. Also comment extravaganza
+ */
+/mob/living/simple_animal/hostile/megafauna/legion/hard
+ name = "Enraged Legion"
+ desc = "THE one in the many."
+ icon = 'sandcode/icons/mob/lavaland/96x96megafauna.dmi'
+ icon_state = "mega_legion"
+ icon_living = "mega_legion"
+ armour_penetration = 50
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ speed = 5
+ ranged = TRUE
+ del_on_death = TRUE
+ retreat_distance = 5
+ minimum_distance = 5
+ ranged_cooldown_time = 20
+ pixel_y = -16
+ pixel_x = -32
+
+ loot = list(/obj/item/stack/sheet/bone = 3)
+ vision_range = 13
+ wander = FALSE
+ elimination = TRUE
+ appearance_flags = 0
+ mouse_opacity = MOUSE_OPACITY_ICON
+ size = 3
+ charging = FALSE
+ true_spawn = TRUE
+
+/obj/item/gps/internal/legion/hard
+ icon_state = null
+ gpstag = "Enraged Echoing Signal"
+ desc = "The message screeches."
+ invisibility = 100
+
+/mob/living/simple_animal/hostile/megafauna/legion/hard/Initialize()
+ ..()
+ internal = new/obj/item/gps/internal/legion/hard(src)
+
+/mob/living/simple_animal/hostile/megafauna/legion/hard/OpenFire(the_target)
+ if(charging)
+ return
+ ranged_cooldown = world.time + ranged_cooldown_time
+ switch(rand(4)) //Larger skulls use more attacks.
+ if(0 to 2)
+ create_legion_skull()
+ if(3)
+ charge_target()
+ if(4)
+ create_legion_turrets()
+
+//SKULLS
+
+///Attack proc. Spawns a singular legion skull.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/proc/create_legion_skull()
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
+ A.GiveTarget(target)
+ A.friends = friends
+ A.faction = faction
+
+//CHARGE
+
+///Attack proc. Gives legion some movespeed buffs and switches the AI to melee. At lower sizes, this also throws the skull at the player.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/proc/charge_target()
+ visible_message("[src] charges!")
+ SpinAnimation(speed = 20, loops = 3, parallel = FALSE)
+ ranged = FALSE
+ retreat_distance = 0
+ minimum_distance = 0
+ set_varspeed(0)
+ charging = TRUE
+ addtimer(CALLBACK(src, .proc/reset_charge), 60)
+ var/mob/living/L = target
+ if(!istype(L) || L.stat != DEAD) //I know, weird syntax, but it just works.
+ addtimer(CALLBACK(src, .proc/throw_thyself), 20)
+
+///This is the proc that actually does the throwing. Charge only adds a timer for this.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/proc/throw_thyself()
+ playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE)
+ throw_at(target, 7, 1.1, src, FALSE, FALSE, CALLBACK(GLOBAL_PROC, .proc/playsound, src, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY)
+
+///Deals some extra damage on throw impact.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/throw_impact(mob/living/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ if(istype(hit_atom))
+ playsound(src, attack_sound, 100, TRUE)
+ hit_atom.apply_damage(22 * size / 2) //It gets pretty hard to dodge the skulls when there are a lot of them. Scales down with size
+ hit_atom.safe_throw_at(get_step(src, get_dir(src, hit_atom)), 2) //Some knockback. Prevent the legion from melee directly after the throw.
+
+//TURRETS
+
+///Attack proc. Creates up to three legion turrets on suitable turfs nearby.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/proc/create_legion_turrets(minimum = 2, maximum = size * 2)
+ playsound(src, 'sound/magic/RATTLEMEBONES.ogg', 100, TRUE)
+ var/list/possiblelocations = list()
+ for(var/turf/T in oview(src, 4)) //Only place the turrets on open turfs
+ if(is_blocked_turf(T))
+ continue
+ possiblelocations += T
+ for(var/i in 1 to min(rand(minimum, maximum), LAZYLEN(possiblelocations))) //Makes sure aren't spawning in nullspace.
+ var/chosen = pick(possiblelocations)
+ new /obj/structure/legionturret(chosen)
+ possiblelocations -= chosen
+
+/mob/living/simple_animal/hostile/megafauna/legion/hard/GiveTarget(new_target)
+ . = ..()
+ if(target)
+ wander = TRUE
+
+///This makes sure that the legion door opens on taking damage, so you can't cheese this boss.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ if(GLOB.necropolis_gate && true_spawn)
+ GLOB.necropolis_gate.toggle_the_gate(null, TRUE) //very clever.
+ return ..()
+
+///In addition to parent functionality, this will also turn the target into a small legion if they are unconcious.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/AttackingTarget()
+ . = ..()
+ if(. && ishuman(target))
+ var/mob/living/L = target
+ if(L.stat == UNCONSCIOUS)
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
+ A.infest(L)
+
+///Resets the charge buffs.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/reset_charge()
+ ranged = TRUE
+ retreat_distance = 5
+ minimum_distance = 5
+ set_varspeed(2)
+ charging = FALSE
+
+///Special snowflake death() here. Can only die if size is 1 or lower and HP is 0 or below.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/death()
+ //Make sure we didn't get cheesed
+ if(health > 0)
+ return
+ if(Split())
+ return
+ //We check what loot we should drop.
+ var/last_legion = TRUE
+ for(var/mob/living/simple_animal/hostile/megafauna/legion/hard/other in GLOB.mob_living_list)
+ if(other != src)
+ last_legion = FALSE
+ break
+ if(last_legion)
+ loot = list(/obj/structure/closet/crate/necropolis/legion/hard)
+ elimination = FALSE
+ else if(prob(80)) //80% chance for sick lootz!
+ loot = list(/obj/structure/closet/crate/necropolis/tendril/legion_loot)
+ if(!true_spawn)
+ loot = null
+ return ..()
+
+///Splits legion into smaller skulls.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/proc/Split()
+ size--
+ if(size < 1)
+ return FALSE
+ adjustHealth(-maxHealth) //We heal in preparation of the split
+ switch(size) //Yay, switches
+ if(3 to INFINITY)
+ icon = initial(icon)
+ pixel_x = initial(pixel_x)
+ pixel_y = initial(pixel_y)
+ maxHealth = initial(maxHealth)
+ if(2)
+ icon = 'sandcode/icons/mob/lavaland/64x64megafauna.dmi'
+ pixel_x = -16
+ pixel_y = -8
+ maxHealth = 350
+ if(1)
+ icon = 'sandcode/icons/mob/lavaland/lavaland_monsters.dmi'
+ pixel_x = 0
+ pixel_y = 0
+ maxHealth = 200
+ visible_message("This is getting out of hands. Now there are three of them!")
+ for(var/i in 1 to 2) //Create three skulls in total
+ var/mob/living/simple_animal/hostile/megafauna/legion/hard/L = new(loc)
+ L.setVarsAfterSplit(src)
+ return TRUE
+
+///Sets the variables for new legion skulls. Usually called after splitting.
+/mob/living/simple_animal/hostile/megafauna/legion/hard/proc/setVarsAfterSplit(var/mob/living/simple_animal/hostile/megafauna/legion/L)
+ maxHealth = L.maxHealth
+ updatehealth()
+ size = L.size
+ icon = L.icon
+ pixel_x = L.pixel_x
+ pixel_y = L.pixel_y
+ faction = L.faction.Copy()
+ GiveTarget(L.target)
+
+///A basic turret that shoots at nearby mobs. Intended to be used for the legion megafauna.
+/obj/structure/legionturret
+ name = "\improper Legion sentinel"
+ desc = "The eye pierces your soul."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "legion_turret"
+ light_power = 0.5
+ light_range = 2
+ max_integrity = 80
+ luminosity = 6
+ anchored = TRUE
+ density = TRUE
+ layer = ABOVE_OBJ_LAYER
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 100,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ ///What kind of projectile the actual damaging part should be.
+ var/projectile_type = /obj/item/projectile/beam/legion
+ ///Time until the tracer gets shot
+ var/initial_firing_time = 18
+ ///How long it takes between shooting the tracer and the projectile.
+ var/shot_delay = 8
+ ///Compared with the targeted mobs. If they have the faction, turret won't shoot.
+ var/faction = list("mining")
+
+/obj/structure/legionturret/Initialize()
+ . = ..()
+ addtimer(CALLBACK(src, .proc/set_up_shot), initial_firing_time)
+
+///Handles an extremely basic AI
+/obj/structure/legionturret/proc/set_up_shot()
+ for(var/mob/living/L in oview(9, src))
+ if(L.stat == DEAD || L.stat == UNCONSCIOUS)
+ continue
+ if(faction_check(faction, L.faction))
+ continue
+ fire(L)
+ return
+ fire(get_edge_target_turf(src, pick(GLOB.cardinals)))
+
+///Called when attacking a target. Shoots a projectile at the turf underneath the target.
+/obj/structure/legionturret/proc/fire(atom/target)
+ var/turf/T = get_turf(target)
+ var/turf/T1 = get_turf(src)
+ if(!T || !T1)
+ return
+ //Now we generate the tracer.
+ var/angle = Get_Angle(T1, T)
+ var/datum/point/vector/V = new(T1.x, T1.y, T1.z, 0, 0, angle)
+ generate_tracer_between_points(V, V.return_vector_after_increments(6), /obj/effect/projectile/tracer/legion/tracer, 0, shot_delay, 0, 0, 0, null)
+ playsound(src, 'sound/machines/airlockopen.ogg', 100, TRUE)
+ addtimer(CALLBACK(src, .proc/fire_beam, angle), shot_delay)
+
+///Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction.
+/obj/structure/legionturret/proc/fire_beam(angle)
+ var/obj/item/projectile/ouchie = new projectile_type(loc)
+ ouchie.firer = src
+ ouchie.fire(angle)
+ playsound(src, 'sound/effects/bin_close.ogg', 100, TRUE)
+ QDEL_IN(src, 5)
+
+///Used for the legion turret.
+/obj/item/projectile/beam/legion
+ name = "blood pulse"
+ hitsound = 'sound/magic/magic_missile.ogg'
+ damage = 19
+ range = 6
+ eyeblur = 0
+ light_color = LIGHT_COLOR_RED
+ impact_effect_type = /obj/effect/temp_visual/kinetic_blast
+ tracer_type = /obj/effect/projectile/tracer/legion
+ muzzle_type = /obj/effect/projectile/tracer/legion
+ impact_type = /obj/effect/projectile/tracer/legion
+ hitscan = TRUE
+ movement_type = UNSTOPPABLE
+
+///Used for the legion turret tracer.
+/obj/effect/projectile/tracer/legion/tracer
+ icon = 'sandcode/icons/effects/beam.dmi'
+ icon_state = "blood_light"
+
+///Used for the legion turret beam.
+/obj/effect/projectile/tracer/legion
+ icon = 'sandcode/icons/effects/beam.dmi'
+ icon_state = "blood"
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
new file mode 100644
index 0000000000..64ffdb492f
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -0,0 +1,178 @@
+/mob/living/simple_animal/hostile/megafauna
+ var/glorykill = FALSE //CAN THIS MOTHERFUCKER BE SNAPPED IN HALF FOR HEALTH?
+ var/list/glorymessageshand = list() //WHAT THE FUCK ARE THE MESSAGES SAID BY THIS FUCK WHEN HE'S GLORY KILLED WITH AN EMPTY HAND?
+ var/list/glorymessagescrusher = list() //SAME AS ABOVE BUT CRUSHER
+ var/list/glorymessagespka = list() //SAME AS ABOVE THE ABOVE BUT PKA
+ var/list/glorymessagespkabayonet = list() //SAME AS ABOVE BUT WITH A HONKING KNIFE ON THE FUCKING THING
+ var/gloryhealth = 200
+ var/glorythreshold = 100
+ var/list/songs = list()
+ var/sound/chosensong
+ var/chosenlength
+ var/chosenlengthstring
+ var/songend
+ var/retaliated = FALSE
+ var/retaliatedcooldowntime = 6000
+ var/retaliatedcooldown
+
+/mob/living/simple_animal/hostile/megafauna/SetRecoveryTime(buffer_time, ranged_buffer_time)
+ recovery_time = world.time + buffer_time
+ ranged_cooldown = world.time + buffer_time
+ if(ranged_buffer_time)
+ ranged_cooldown = world.time + ranged_buffer_time
+
+/mob/living/simple_animal/hostile/megafauna
+ var/list/enemies = list()
+
+/mob/living/simple_animal/hostile/megafauna/Found(atom/A)
+ if(isliving(A))
+ var/mob/living/L = A
+ if(!L.stat)
+ return L
+ else
+ enemies -= L
+ else if(ismecha(A))
+ var/obj/mecha/M = A
+ if(M.occupant)
+ return A
+
+/mob/living/simple_animal/hostile/megafauna/ListTargets()
+ if(!enemies.len)
+ return list()
+ var/list/see = ..()
+ see &= enemies // Remove all entries that aren't in enemies
+ return see
+
+/mob/living/simple_animal/hostile/megafauna/proc/Retaliate()
+ var/list/around = view(src, vision_range)
+ for(var/atom/movable/A in around)
+ if(A == src)
+ continue
+ if(isliving(A))
+ var/mob/living/M = A
+ if((faction_check_mob(M) && attack_same) || (!faction_check_mob(M)) || (!ismegafauna(M)))
+ enemies |= M
+ chosenlengthstring = pick(songs)
+ chosenlength = text2num(chosenlengthstring)
+ chosensong = songs[chosenlengthstring]
+ if(chosensong && !songend)
+ if(M.client.prefs.toggles & SOUND_BOSS_MUSIC)
+ M.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ songend = chosenlength + world.time
+ SEND_SOUND(M, chosensong) // so silence boss music will mute moosic for people who don't want that, or it just doesn't play at all if prefs disable it
+ if(!retaliated)
+ src.visible_message("[src] seems pretty pissed off at [M]!")
+ retaliated = TRUE
+ retaliatedcooldown = world.time + retaliatedcooldowntime
+ else if(ismecha(A))
+ var/obj/mecha/M = A
+ if(M.occupant && M.occupant.client)
+ enemies |= M
+ enemies |= M.occupant
+ var/mob/living/O = M.occupant
+ if(O.client.prefs.toggles & SOUND_BOSS_MUSIC)
+ O.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ songend = chosenlength + world.time
+ SEND_SOUND(O, chosensong)
+ if(!retaliated)
+ src.visible_message("[src] seems pretty pissed off at [M]!")
+ retaliated = TRUE
+ retaliatedcooldown = world.time + retaliatedcooldowntime
+
+ for(var/mob/living/simple_animal/hostile/megafauna/H in around)
+ if(faction_check_mob(H) && !attack_same && !H.attack_same)
+ H.enemies |= enemies
+ return 0
+
+/mob/living/simple_animal/hostile/megafauna/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+ . = ..()
+ if(. > 0 && stat == CONSCIOUS)
+ Retaliate()
+
+/mob/living/simple_animal/hostile/megafauna/Life()
+ ..()
+ if(songend)
+ if(world.time >= songend)
+ for(var/mob/living/M in view(src, vision_range))
+ if(client)
+ if(M.client.prefs.toggles & SOUND_BOSS_MUSIC)
+ M.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ songend = chosenlength + world.time
+ SEND_SOUND(M, chosensong)
+ if(health <= glorythreshold && !glorykill && stat != DEAD)
+ glorykill = TRUE
+ glory()
+ if(retaliated)
+ if(retaliatedcooldown < world.time)
+ retaliated = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/proc/glory()
+ desc += "
[src] is staggered and can be glory killed!"
+ animate(src, color = "#00FFFF", time = 5)
+
+/mob/living/simple_animal/hostile/megafauna/death()
+ if(health > 0)
+ return
+ else
+ for(var/mob/living/M in view(src, vision_range))
+ if(M.client)
+ M.stop_sound_channel(CHANNEL_BOSSMUSIC)
+ animate(src, color = initial(color), time = 3)
+ desc = initial(desc)
+ var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ var/crusher_kill = FALSE
+ if(C && crusher_loot && C.total_damage >= maxHealth * 0.6)
+ spawn_crusher_loot()
+ crusher_kill = TRUE
+ if(!(flags_1 & ADMIN_SPAWNED_1))
+ var/tab = "megafauna_kills"
+ if(crusher_kill)
+ tab = "megafauna_kills_crusher"
+ SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]")
+ if(!elimination) //used so the achievment only occurs for the last legion to die.
+ grant_achievement(medal_type, score_type, crusher_kill)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/AltClick(mob/living/carbon/slayer)
+ if(glorykill)
+ if(ranged)
+ if(ranged_cooldown >= world.time)
+ ranged_cooldown += 10
+ else
+ ranged_cooldown = 10 + world.time
+ if(do_after(slayer, 10, needhand = TRUE, target = src, progress = FALSE) && (stat != DEAD))
+ var/message
+ if(!slayer.get_active_held_item() || (!istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher) && !istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator)))
+ message = pick(glorymessageshand)
+ else if(istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher))
+ message = pick(glorymessagescrusher)
+ else if(istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator))
+ message = pick(glorymessagespka)
+ var/obj/item/gun/energy/kinetic_accelerator/KA = get_active_held_item()
+ if(KA && KA.bayonet)
+ message = pick(glorymessagespka | glorymessagespkabayonet)
+ if(message)
+ visible_message("[slayer] [message]")
+ else
+ visible_message("[slayer] does something generally considered brutal to [src]... Whatever that may be!")
+ adjustHealth(maxHealth, TRUE, TRUE)
+ if(mob_biotypes & MOB_ORGANIC)
+ new /obj/effect/gibspawner/generic(src.loc)
+ else if(mob_biotypes & MOB_ROBOTIC)
+ new /obj/effect/gibspawner/robot(src.loc)
+ slayer.heal_overall_damage(gloryhealth,gloryhealth)
+ else
+ to_chat(slayer, "You fail to glory kill [src]!")
+
+/mob/living/simple_animal/hostile/megafauna/devour(mob/living/L)
+ if(!L)
+ return
+ visible_message(
+ "[src] devours [L]!",
+ "You feast on [L], restoring your health!")
+ if(!is_station_level(z) || client) //NPC monsters won't heal while on station
+ adjustBruteLoss(-L.maxHealth/2)
+ if(L.client)
+ L.stop_sound_channel(CHANNEL_AMBIENCE)
+ L.gib()
+ ..()
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm
new file mode 100644
index 0000000000..9e64ebc73c
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/rogueprocess.dm
@@ -0,0 +1,285 @@
+/mob/living/simple_animal/hostile/megafauna/rogueprocess
+ name = "Rogue Process"
+ desc = "Once an experimental mecha carrying an advanced mining AI, now it's out for blood."
+ health = 2500
+ maxHealth = 2500
+ movement_type = GROUND
+ attack_verb_continuous = "drills"
+ attack_verb_simple = "drill"
+ attack_sound = 'sound/weapons/drill.ogg'
+ icon = 'sandcode/icons/mob/lavaland/rogue.dmi'
+ icon_state = "rogue"
+ icon_living = "rogue"
+ icon_dead = "rogue-broken"
+ friendly_verb_continuous = "pokes"
+ friendly_verb_simple = "poke"
+ speak_emote = list("screeches")
+ mob_biotypes = MOB_ROBOTIC
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ speed = 1
+ move_to_delay = 10
+ ranged_cooldown_time = 80
+ ranged = 1
+ del_on_death = 0
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/rogue/crusher)
+ loot = list(/obj/structure/closet/crate/necropolis/rogue)
+ deathmessage = "sparkles and emits corrupted screams in agony, falling defeated on the ground."
+ death_sound = 'sound/mecha/critdestr.ogg'
+ anger_modifier = 0
+ footstep_type = FOOTSTEP_MOB_HEAVY
+ mob_biotypes = MOB_ROBOTIC
+ songs = list("2930" = sound(file = 'sandcode/sound/ambience/mbrsystemshock.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC)) //System shock theme remix by Master Boot Record
+ var/special = FALSE
+ wander = FALSE
+ faction = list("mining", "boss")
+ weather_immunities = list("lava","ash")
+ blood_volume = 0
+ var/min_sparks = 1
+ var/max_sparks = 4
+
+/obj/item/gps/internal/rogueprocess
+ icon_state = null
+ gpstag = "Corrupted Signal"
+ desc = "It's full of ransomware."
+ invisibility = 100
+
+/obj/item/projectile/plasma/rogue
+ dismemberment = 0
+ damage = 25
+ pixels_per_second = TILES_TO_PIXELS(10)
+ range = 21
+ color = "#FF0000"
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/Initialize()
+ . = ..()
+ internal = new /obj/item/gps/internal/rogueprocess(src)
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/adjustHealth(amount, updating_health, forced)
+ . = ..()
+ if(.)
+ anger_modifier = round(clamp(((maxHealth - health) / 42),0,60))
+ move_to_delay = clamp(round((src.health/src.maxHealth) * 10), 2.5, 8)
+ wander = FALSE
+ do_sparks(rand(min_sparks,max_sparks), FALSE, src)
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/OpenFire(target)
+ if(special)
+ return FALSE
+ ranged_cooldown = world.time + min((ranged_cooldown_time - anger_modifier), 60)
+ switch(anger_modifier)
+ if(0 to 25)
+ if(prob(50))
+ INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
+ sleep(6)
+ INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
+ sleep(4)
+ INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
+ else
+ INVOKE_ASYNC(src, .proc/shockwave, src.dir, 7, TRUE)
+ if(25 to 50)
+ if(prob(60))
+ INVOKE_ASYNC(src, .proc/plasmaburst, target, FALSE)
+ sleep(5)
+ INVOKE_ASYNC(src, .proc/plasmaburst, target, TRUE)
+ sleep(3)
+ INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
+ sleep(3)
+ if(prob(50))
+ INVOKE_ASYNC(src, .proc/plasmashot, target, FALSE)
+ else
+ INVOKE_ASYNC(src, .proc/shockwave, WEST, 10, TRUE)
+ INVOKE_ASYNC(src, .proc/shockwave, EAST, 10, TRUE)
+ sleep(7)
+ INVOKE_ASYNC(src, .proc/shockwave, NORTH, 10, TRUE)
+ INVOKE_ASYNC(src, .proc/shockwave, SOUTH, 10, TRUE)
+ if(50 to INFINITY)
+ if(prob(65))
+ if(prob(60))
+ INVOKE_ASYNC(src, .proc/plasmaburst, target, FALSE)
+ INVOKE_ASYNC(src, .proc/shockwave, src.dir, 15, FALSE)
+ sleep(5)
+ INVOKE_ASYNC(src, .proc/plasmaburst, target, FALSE)
+ sleep(5)
+ INVOKE_ASYNC(src, .proc/plasmaburst, target, FALSE)
+ sleep(3)
+ INVOKE_ASYNC(src, .proc/plasmaburst, target, FALSE)
+ else
+ var/turf/up = locate(x, y + 10, z)
+ var/turf/down = locate(x, y - 10, z)
+ var/turf/left = locate(x - 10, y, z)
+ var/turf/right = locate(x + 10, y, z)
+ INVOKE_ASYNC(src, .proc/plasmaburst, up, TRUE)
+ INVOKE_ASYNC(src, .proc/plasmaburst, down, FALSE)
+ sleep(3)
+ INVOKE_ASYNC(src, .proc/plasmashot, left, FALSE)
+ INVOKE_ASYNC(src, .proc/plasmashot, right, FALSE)
+ sleep(10)
+ if(prob(35))
+ for(var/dire in GLOB.cardinals)
+ INVOKE_ASYNC(src, .proc/shockwave, dire, 7, TRUE)
+ else
+ INVOKE_ASYNC(src, .proc/ultishockwave, 7, TRUE)
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/Move()
+ . = ..()
+ if(special)
+ return FALSE
+ playsound(src.loc, 'sound/mecha/mechmove01.ogg', 200, 1, 2, 1)
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/Bump(atom/A)
+ . = ..()
+ if(isturf(A) || isobj(A) && A.density)
+ A.ex_act(EXPLODE_HEAVY)
+ DestroySurroundings()
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/plasmashot(atom/target, var/specialize = TRUE)
+ var/path = get_dist(src, target)
+ if(path > 2)
+ if(!target)
+ return
+ visible_message("[src] raises it's plasma cutter!")
+ if(specialize)
+ special = TRUE
+ sleep(3)
+ var/turf/startloc = get_turf(src)
+ var/obj/item/projectile/P = new /obj/item/projectile/plasma/rogue(startloc)
+ playsound(src, 'sound/weapons/laser.ogg', 100, TRUE)
+ P.preparePixelProjectile(target, startloc)
+ P.firer = src
+ P.original = target
+ var/set_angle = Get_Angle(src, target)
+ P.fire(set_angle)
+ if(specialize)
+ special = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/plasmaburst(atom/target, var/specialize = TRUE)
+ var/list/theline = get_dist(src, target)
+ if(theline > 2)
+ if(!target)
+ return
+ visible_message("[src] raises it's tri-shot plasma cutter!")
+ if(specialize)
+ special = TRUE
+ var/ogangle = Get_Angle(src, target)
+ sleep(7)
+ var/turf/startloc = get_turf(src)
+ var/obj/item/projectile/P = new /obj/item/projectile/plasma/rogue(startloc)
+ var/turf/otherangle = (ogangle + 45)
+ var/turf/otherangle2 = (ogangle - 45)
+ playsound(src, 'sound/weapons/laser.ogg', 100, TRUE)
+ P.preparePixelProjectile(target, startloc)
+ P.firer = src
+ P.original = target
+ P.fire(ogangle)
+ var/obj/item/projectile/X = new /obj/item/projectile/plasma/rogue(startloc)
+ playsound(src, 'sound/weapons/laser.ogg', 100, TRUE)
+ X.preparePixelProjectile(target, startloc)
+ X.firer = src
+ X.original = target
+ X.fire(otherangle)
+ var/obj/item/projectile/Y = new /obj/item/projectile/plasma/rogue(startloc)
+ playsound(src, 'sound/weapons/laser.ogg', 100, TRUE)
+ Y.preparePixelProjectile(target, startloc)
+ Y.firer = src
+ Y.original = target
+ Y.fire(otherangle2)
+ if(specialize)
+ special = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/knockdown(var/specialize = TRUE)
+ visible_message("[src] smashes into the ground!")
+ if(specialize)
+ special = TRUE
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ var/list/hit_things = list()
+ sleep(7)
+ for(var/turf/T in oview(2, src))
+ if(!T)
+ if(specialize)
+ special = FALSE
+ return
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things))
+ if(!faction_check(faction, L.faction))
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, L))
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ L.Stun(20)
+ L.apply_damage_type(40, BRUTE)
+ hit_things += L
+ sleep(3)
+ if(specialize)
+ special = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/shockwave(direction, range, var/specialize = TRUE)
+ visible_message("[src] smashes the ground in a general direction!!")
+ if(specialize)
+ special = TRUE
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ sleep(5)
+ var/list/hit_things = list()
+ var/turf/T = get_turf(get_step(src, src.dir))
+ var/ogdir = direction
+ var/turf/otherT = get_step(T, turn(ogdir, 90))
+ var/turf/otherT2 = get_step(T, turn(ogdir, -90))
+ if(!T)
+ if(specialize)
+ special = FALSE
+ return
+ for(var/i in 1 to range)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(otherT)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(otherT2)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(T, get_dir(T, L))
+ L.safe_throw_at(throwtarget, 5, 1, src)
+ L.Stun(10)
+ L.apply_damage_type(25, BRUTE)
+ hit_things += L
+ for(var/mob/living/L in otherT.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(otherT, get_dir(otherT, L))
+ L.safe_throw_at(throwtarget, 5, 1, src)
+ L.Stun(10)
+ L.apply_damage_type(25, BRUTE)
+ hit_things += L
+ for(var/mob/living/L in otherT2.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(otherT2, get_dir(otherT2, L))
+ L.safe_throw_at(throwtarget, 5, 1, src)
+ L.Stun(10)
+ L.apply_damage_type(25, BRUTE)
+ hit_things += L
+ T = get_step(T, ogdir)
+ otherT = get_step(otherT, ogdir)
+ otherT2 = get_step(otherT2, ogdir)
+ sleep(1.5)
+ if(specialize)
+ special = FALSE
+
+/mob/living/simple_animal/hostile/megafauna/rogueprocess/proc/ultishockwave(range, var/specialize = TRUE)
+ visible_message("[src] smashes the ground around them!!")
+ if(specialize)
+ special = TRUE
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ sleep(10)
+ var/list/hit_things = list()
+ for(var/i in 1 to range)
+ for(var/turf/T in (view(i, src) - view(i - 1, src)))
+ if(!T)
+ if(specialize)
+ special = FALSE
+ return
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things) && !faction_check(L.faction, faction))
+ var/throwtarget = get_edge_target_turf(T, get_dir(T, L))
+ L.safe_throw_at(throwtarget, 5, 1, src)
+ L.Stun(10)
+ L.apply_damage_type(25, BRUTE)
+ hit_things += L
+ sleep(3)
+ if(specialize)
+ special = FALSE
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm
new file mode 100644
index 0000000000..be9138fd59
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/megafauna/sif.dm
@@ -0,0 +1,363 @@
+/*
+Original PR made by sushifish on Russ Station. Bob joga just did a lazy ass port.
+SIF (Sprites and ideas by MetalGearMan)
+
+Sif spawns randomly in lavaland when it can, in the form of a sword which the user needs to interact with in order to summon Sif.
+
+Speical attacks:
+ - When Sif's able to he will charge his current target with 200% increased speed for 1 second, getting right next to his target.
+ - Sif can also do an AOE spin attack.
+
+ Links for videos on all of Sif's modes and attacks:
+
+ Summon: https://bungdeep.com/Sif/Sif_Summon.mp4
+ Angered Stage: https://bungdeep.com/Sif/Sif_Angered.mp4
+ Enraged Stage: https://bungdeep.com/Sif/Sif_Enraged.mp4
+
+ Projectile Dodge: https://bungdeep.com/Sif/Sif_Dodge.mp4
+
+ AOE Spin: https://bungdeep.com/Sif/Sif_Spin.mp4
+ Charge: https://bungdeep.com/Sif/Sif_Charge.mp4
+ Spin and Charge: https://bungdeep.com/Sif/Sif_Spin_and_charge.mp4
+
+ Death: https://bungdeep.com/Sif/Sif_Death.mp4
+
+Sif has three stages:
+ 1. Normal state when it has health above 50%.
+ 2. When Sif reaches below 50% health it enters a angered state, which makes Sif's movement speed faster and attack speed slower,
+ with increased usage of specials.
+ 3. At 20% health Sif is significantly slowed but constantly doing special attacks.
+
+WHEN SIF IS ANGERED (Stage 2):
+ - Sif's specials take 50% less time to recharge from (Normal = 100) to (Angered = 50)
+ - Sif's attack speed decreased by 30% and movement speed increased by 50%
+
+WHEN SIF IS ENRAGED (Stage 3):
+ - Sif's specials take 60% less time to recharge from (Angered = 50) to (Enraged = 30)
+ - Sif is way slower but does more damage, as well as chances to dodge projectiles and melee attacks more often.
+
+When Sif dies, it leaves behind a:
+ !! Sword Of The Forsaken !! -> Giant ass sword that does damage. Small chance of blocking hits and almost no chance to block projectiles.
+ !! Necklace Of The Forsaken !! -> Works by instantly reviving or fully healing the user at their discretion (one time use and can be used when dead, knocked out or alive)
+ !! Dark Energy !! (If killed with a kinetic crusher) -> A Kinetic Crusher attachment which performs a bash attack for 100 damage (only works on big boy mobs like megafaunas)
+Difficulty: Medium
+*/
+
+/mob/living/simple_animal/hostile/megafauna/sif
+ name = "Great Brown Wolf Sif"
+ desc = "Guardian of the abyss. Looks pretty pissed that you're here."
+ health = 2000
+ maxHealth = 2000
+ movement_type = GROUND
+ attack_verb_continuous = "slashes"
+ attack_verb_simple = "slash"
+ attack_sound = 'sandcode/sound/sif/sif_slash.ogg'
+ icon_state = "Great_Brown_Wolf"
+ icon_living = "Great_Brown_Wolf"
+ icon_dead = ""
+ friendly_verb_continuous = "stares down"
+ friendly_verb_simple = "stare down"
+ icon = 'sandcode/icons/mob/lavaland/sif.dmi'
+ speak_emote = list("growls")
+ armour_penetration = 50
+ melee_damage_lower = 35
+ melee_damage_upper = 35
+ speed = 1.5
+ pixel_x = -32 //Hit box perfectly centered
+ pixel_y = -16
+ move_to_delay = 3
+ rapid_melee = 2
+ melee_queue_distance = 10
+ ranged = FALSE
+ del_on_death = 1
+ loot = list(/obj/structure/closet/crate/necropolis/sif)
+ crusher_loot = list(/obj/structure/closet/crate/necropolis/sif/crusher)
+
+ deathmessage = "falls into the abyss."
+ deathsound = 'sandcode/sound/sif/death_howl.ogg'
+ var/can_special = 1 //Enables sif to do what he does best, spin and charge
+ var/spinIntervals = 0 //Counts how many spins Sif does before setting spinning status to false
+ var/spinning = FALSE //AOE spin special attack status
+ var/charging = FALSE //dashing special attack status
+ var/angered = FALSE //active at < 50% health
+ var/enraged = FALSE //active at < 20% health
+ var/stageTwo = FALSE
+ var/stageThree = FALSE
+ var/currentPower = 0 //Every few seconds this variable gets higher, when it gets high
+ //enough it will use a special attack then reset the variable to 0w
+ songs = list("2670" = sound(file = 'sandcode/sound/ambience/furidanger802.ogg', repeat = 0, wait = 0, volume = 60, channel = CHANNEL_BOSSMUSIC))
+ glorymessageshand = list("climbs atop the wolf's head as it dangles weakly near the ground, ripping its left eye off and jumping down before punching through it's cranium!", "goes around the wolf and rips off their tail, using it as whip on the fiend")
+ glorymessagescrusher = list("chops off the wolf's head by it's neck!")
+ glorymessagespka = list("shoots at the wolf's eyes with their PKA, exploding them into giblets!")
+ glorymessagespkabayonet = list("slides down below Sif, using their bayonet to rip it's stomach open!")
+ var/list/hit_things = list()
+
+/obj/item/gps/internal/sif
+ icon_state = null
+ gpstag = "Infinity Signal"
+ desc = "No, it's not thanos."
+
+/mob/living/simple_animal/hostile/megafauna/sif/Initialize(mapload)
+ . = ..()
+ internal = new /obj/item/gps/internal/sif(src)
+
+//Sword structure, used to summon sif.
+/obj/structure/sword/sif
+ name = "Massive Glowing Sword"
+ desc = "Sweet! A free sword!"
+ max_integrity = 10000
+ anchored = TRUE
+ icon = 'sandcode/icons/mob/lavaland/sif_sword.dmi'
+ icon_state = "Idle_Sword"
+ layer = HIGH_OBJ_LAYER //Looks better when its over everything... cause its huge
+ var/obj/item/gps/internal/geepm
+
+/obj/structure/sword/sif/Initialize()
+ . = ..()
+ geepm = new /obj/item/gps/internal/sif(src)
+
+//When the sword is touched it will spawn sif.
+/obj/structure/sword/sif/attack_hand(mob/user)
+ icon_state = "Interact_Sword"
+ playsound(get_turf(src.loc), 'sound/effects/curse1.ogg', 100, 1)
+ spawn(30)
+ if(!QDELETED(src))
+ new /mob/living/simple_animal/hostile/megafauna/sif(get_turf(src.loc))
+ visible_message("The ground shakes.")
+ playsound(get_turf(src.loc), 'sound/effects/curse3.ogg', 100, 1)
+ playsound(get_turf(src.loc), 'sound/effects/meteorimpact.ogg', 100, 1)
+ qdel(src)
+
+//Sif's charge attack
+/mob/living/simple_animal/hostile/megafauna/sif/proc/rush()
+
+ //Target
+ if(!target)
+ return //Exit porc
+
+ var/chargeturf = get_turf(target)
+
+ //Targets turf
+ if(!chargeturf)
+ return //Exit proc
+
+ var/dir = get_dir(src, chargeturf)
+ var/turf/T = get_ranged_target_turf(chargeturf, dir, 2)
+
+ //Turfs area
+ if(!T)
+ return //Exit proc
+
+ //Start charging
+ charging = TRUE
+ DestroySurroundings()
+ walk(src, 0)
+ setDir(dir)
+ var/movespeed = 1
+ walk_to(src, T, movespeed)
+ var/atom/prevLoc = target.loc
+ sleep((get_dist(src, T) * movespeed) + 1)
+ src.loc = prevLoc
+ walk(src, 0)
+ charging = FALSE
+ //Stop charging
+
+/mob/living/simple_animal/hostile/megafauna/sif/Move()
+ //Move
+ ..()
+
+ //Can they perform these tasks?
+ if(can_special == 1)
+
+ //Charging currentPower every step
+ if(!charging || !spinning)
+ src.currentPower += 2
+
+ //Sets sif's anger status.
+ if(src.health <= 1000 && src.stageTwo == FALSE)
+ angered()
+
+ //Sets sifs enrage status.
+ if(src.health <= 400 && src.stageThree == FALSE)
+ enraged()
+
+ //Whenever Sif moves he destroys walls in his way.
+ if(src.angered == TRUE || src.enraged == TRUE)
+ DestroySurroundings()
+
+ //Normally Sif will do a special when he has 100 currentPower.
+ if(src.angered == FALSE && src.currentPower >= 100)
+ special()
+
+ //Now requires 50 power when angery
+ if(src.angered == TRUE && src.currentPower >= 50 && src.enraged == FALSE)
+ special()
+
+ //Now requires 30 power when enraged
+ if(src.enraged == TRUE && src.currentPower >= 30)
+ special()
+
+ //visual effect
+ if(src.charging == TRUE)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
+ DestroySurroundings()
+
+//Sif's AOE spin attack
+/mob/living/simple_animal/hostile/megafauna/sif/proc/spinAttack()
+ src.spinning = TRUE
+ spin(5,2)// Spin me boi
+
+//Chance to dodge projectiles when angered or enraged
+/mob/living/simple_animal/hostile/megafauna/sif/bullet_act(obj/item/projectile/P)
+ var/passed = 0
+
+ if(angered)
+ switch(rand(0,100))
+ if(0 to 1)
+ passed = 1
+
+ if(enraged)
+ switch(rand(0,100))
+ if(0 to 5)
+ passed = 1
+
+ if(passed == 1)
+ visible_message("[src] dodged the projectile!", "You dodge the projectile!")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, 1)
+ return 0
+
+ return ..()
+
+//Sets Sif's angered stats
+/mob/living/simple_animal/hostile/megafauna/sif/proc/angered()
+ src.angered = TRUE
+ src.stageTwo = TRUE
+ src.visible_message("[src] lets out a ear ripping howl!", "[src] lets out an ear ripping roar!")
+ playsound(src, 'sandcode/sound/sif/howl.ogg', 100, 1)
+ var/mob/living/L = target
+ shake_camera(L, 4, 3)
+ src.speed = 6
+ src.move_to_delay = 2
+ src.melee_damage_lower = 25
+ src.melee_damage_upper = 25
+ src.rapid_melee = 3
+
+//Sets Sif's enraged stats
+/mob/living/simple_animal/hostile/megafauna/sif/proc/enraged()
+ src.stageThree = TRUE
+ src.enraged = TRUE
+ src.visible_message("[src] lets out a ear ripping yelp!", "[src] lets out an ear ripping yelp!")
+ playsound(src, 'sandcode/sound/sif/howl.ogg', 100, 1)
+ var/mob/living/L = target
+ shake_camera(L, 8, 6)
+ src.speed = 3
+ src.move_to_delay = 4
+ src.melee_damage_lower = 30
+ src.melee_damage_upper = 30
+ src.rapid_melee = 4
+ src.dodge_prob = 50
+
+//Chooses a random special
+/mob/living/simple_animal/hostile/megafauna/sif/proc/special()
+ src.currentPower = 0
+ switch(rand(1,2))
+ if(1)
+ rush()
+ if(2)
+ spinAttack()
+
+/mob/living/simple_animal/hostile/megafauna/sif/proc/default_attackspeed()
+ if(stageTwo)
+ src.move_to_delay = 2
+ return 10
+ if(stageThree)
+ src.move_to_delay = 4
+ return 4
+
+ src.move_to_delay = 3
+ return 2
+
+/mob/living/simple_animal/hostile/megafauna/sif/do_attack_animation(atom/A, visual_effect_icon,used_item, no_effect)
+ if(charging == FALSE)
+ ..()
+
+//Attack speed delay
+//bob's note: everything here is well coded except this like why would you not just use changeNext_move()
+/mob/living/simple_animal/hostile/megafauna/sif/AttackingTarget()
+ if(charging == FALSE)
+ . = ..()
+ if(.)
+ recovery_time = world.time + 10
+
+/mob/living/simple_animal/hostile/megafauna/sif/Goto(target, delay, minimum_distance)
+ if(charging == FALSE)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/sif/MoveToTarget(list/possible_targets)
+ if(charging == FALSE)
+ ..()
+
+//Immune to explosions when spinning or charging
+/mob/living/simple_animal/hostile/megafauna/sif/ex_act(severity, target)
+ return 0
+
+//stop spinning if you lose the target
+/mob/living/simple_animal/hostile/megafauna/sif/LoseTarget()
+ . = ..()
+ if(spinning)
+ icon_state = "Great_Brown_Wolf"
+ src.spinIntervals = 0
+ spinning = FALSE
+ src.speed = default_attackspeed()
+ hit_things = list()
+
+/mob/living/simple_animal/hostile/megafauna/sif/Moved()
+
+ if(can_special == 1)
+
+ if(charging == TRUE)
+ DestroySurroundings()
+
+ //Stop spinning
+ if(src.spinIntervals == 5)
+ icon_state = "Great_Brown_Wolf"
+ src.spinIntervals = 0
+ spinning = FALSE
+ src.speed = default_attackspeed()
+ hit_things = list()
+
+ //Start spinning
+ if(spinning == TRUE)
+ icon_state = "Great_Brown_Wolf_Spin"
+ src.spinIntervals += 1
+ if(isturf(src.loc) || isobj(src.loc) && src.loc.density)
+ for(var/turf/T in view(1, src))
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/LM in view(1, src))
+ if(!(LM in hit_things))
+ LM.Stun(30, TRUE)
+ hit_things += LM
+ playsound(src, pick('sandcode/sound/sif/whoosh1.ogg', 'sandcode/sound/sif/whoosh2.ogg', 'sandcode/sound/sif/whoosh3.ogg'), 300, 1)
+ playsound(src, 'sandcode/sound/sif/blade_spin.ogg', 400, 1)
+ if(angered)
+ src.speed = 6
+ src.move_to_delay = 2
+
+ playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1)
+ ..()
+
+//Activated when sif collides with target when charging.
+/mob/living/simple_animal/hostile/megafauna/sif/Bump(atom/A)
+ if(charging == TRUE)
+ if(isturf(A) || isobj(A) && A.density)
+ A.ex_act(EXPLODE_HEAVY)
+ DestroySurroundings()
+ if(isliving(A))
+ var/mob/living/L = A
+ L.visible_message("[src] stomps on [L]!", "[src] stomps on you!")
+ src.forceMove(get_turf(L))
+ L.apply_damage(20, BRUTE)
+ playsound(get_turf(L), 'sandcode/sound/sif/sif_stomp.ogg', 400, 1)
+ shake_camera(L, 4, 3)
+ shake_camera(src, 2, 3)
+ ..()
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
new file mode 100644
index 0000000000..de6fcf9e64
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher
+ glorymessageshand = list("rips out both of the watcher's wings and shoves them aside, then kicks the downed body until it turns into mush!", "violently rips off one of the watcher's spikes, then stabs them repeatedly with it!")
+ glorymessagespka = list("bashes the shit out of the watcher with their PKA, gushing blood everywhere!", "shoots both of the watcher's wings off, then sticks their PKA on their face and shoots, showering everything in gore!")
+ glorymessagespkabayonet = list("stabs the watcher's eye repeatedly, turning it into a bloody mess!", "slices one wing after another off the watcher, in swift moves!")
+ glorymessagescrusher = list("repeatedly chops the watcher with their crusher, turning it into bloody mush!", "mark detonates the watcher in close proximity, showering viscera everywhere!", "flips their Crusher around, ramming the handle up the Watcher's eye, impaling it, before smashing it against the ground brutally!")
\ No newline at end of file
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm
new file mode 100644
index 0000000000..0bc5c1fe9d
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/candy.dm
@@ -0,0 +1,277 @@
+#define BLOOD_CHARGE 1
+#define BLOODY_TRAP 2
+#define MEAT_SHIELD 3
+#define KNOCKDOWN 4
+
+/**
+ * # Candy
+ *
+ * Kind of like bubblegum's rebellious teenage son/daughter.
+ * Has 4 attacks.
+ * Charge - Charges at it's target.
+ * Bloody Trap - Traps it's target between some walls, and then charges at them.
+ * Meat Shield - Knockbacks all targets in the 3 tiles he faces, and then creates a wall.
+ * Knockdown - Deals damage and knockbacks all targets in a 2 tile radius.
+ */
+
+/mob/living/simple_animal/hostile/asteroid/elite/candy
+ name = "Candy"
+ desc = "In what passes as a hierarchy for slaughter demons, this one is prince."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_elites.dmi'
+ icon_state = "candy"
+ icon_living = "candy"
+ icon_aggro = "candy"
+ icon_dead = "candy_dead"
+ icon_gib = "syndicate_gib"
+ maxHealth = 800
+ health = 800
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ attack_verb_continuous = "punches"
+ attack_verb_simple = "punch"
+ attack_sound = 'sound/magic/demon_consume.ogg'
+ speed = 1
+ move_to_delay = 3
+ mouse_opacity = MOUSE_OPACITY_ICON
+ deathsound = 'sandcode/sound/misc/gorenest.ogg'
+ deathmessage = " screams in agony, before falling headfirst onto the floor."
+ loot_drop = /obj/item/bloodcrawlbottle
+ speak_emote = list("gurgle")
+
+ attack_action_types = list(/datum/action/innate/elite_attack/bloodcharge,
+ /datum/action/innate/elite_attack/bloody_trap,
+ /datum/action/innate/elite_attack/meat_shield,
+ /datum/action/innate/elite_attack/knockdown)
+ glorymessageshand = list("tries punching Candy's head, but they parry it and grab their hand! However, another hard punch comes through with the other arm, this time killing the demon swiftly and exploding their skull!", "grabs Candy by their neck, then pressures into until it explodes and it's head comes flying off!")
+ glorymessagescrusher = list("slashes Candy in half vertically with their crusher, each of the parts falling off onto the ground limply!")
+ glorymessagespka = list("shoots at Candy's head, breaking their skull open and revealing their brain! Then, they bash the brain into mush with their PKA's stock!", "kicks Candy into the ground, and repeatedly slams their PKA against their skull until they finally die!")
+ glorymessagespkabayonet = list("stabs through Candy's maw and lifts them into the air, shooting their PKA and exploding their head as the limp body falls off!")
+
+/datum/action/innate/elite_attack/bloodcharge
+ name = "Blood Charge"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "blood_charge"
+ chosen_message = "You will attempt to charge your target."
+ chosen_attack_num = BLOOD_CHARGE
+
+/datum/action/innate/elite_attack/bloody_trap
+ name = "Bloody Trap"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "bloody_trap"
+ chosen_message = "You will attempt to trap your target."
+ chosen_attack_num = BLOODY_TRAP
+
+/datum/action/innate/elite_attack/meat_shield
+ name = "Meat Shield"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "meat_shield"
+ chosen_message = "You will attempt to shield yourself."
+ chosen_attack_num = MEAT_SHIELD
+
+/datum/action/innate/elite_attack/knockdown
+ name = "Knockdown"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "knockdown"
+ chosen_message = "You will knock down every mob around you."
+ chosen_attack_num = KNOCKDOWN
+
+
+/mob/living/simple_animal/hostile/asteroid/elite/candy/OpenFire()
+ if(client)
+ switch(chosen_attack)
+ if(BLOOD_CHARGE)
+ bloodcharge(target)
+ if(BLOODY_TRAP)
+ bloodytrap(target)
+ if(MEAT_SHIELD)
+ meatshield()
+ if(KNOCKDOWN)
+ knockdown()
+ return
+ var/aiattack = rand(1,4)
+ switch(aiattack)
+ if(BLOOD_CHARGE)
+ bloodcharge(target)
+ if(BLOODY_TRAP)
+ bloodytrap(target)
+ if(MEAT_SHIELD)
+ meatshield()
+ if(KNOCKDOWN)
+ knockdown()
+
+// Candy actions
+/mob/living/simple_animal/hostile/asteroid/elite/candy/proc/bloodcharge(target)
+ ranged_cooldown = world.time + 50
+ var/dir_to_target = get_dir(get_turf(src), get_turf(target))
+ var/turf/T = get_turf(src)
+ playsound(src,'sound/magic/demon_attack1.ogg', 200, 1)
+ visible_message("[src] prepares to charge!")
+ for(var/i in 1 to 6)
+ new /obj/effect/temp_visual/dir_setting/bloodsplatter/candy(T, get_dir(T, target))
+ T = get_step(T, dir_to_target)
+ sleep(1)
+ addtimer(CALLBACK(src, .proc/blood_charge_2, dir_to_target, 0), 5)
+
+/mob/living/simple_animal/hostile/asteroid/elite/candy/proc/bloodytrap(mob/target)
+ playsound(src,'sound/magic/Blind.ogg', 200, 1)
+ var/dir_to_target = get_dir(src, target)
+ var/turf/T = get_step(src, dir_to_target)
+ var/list/bline = getline(T, target.loc)
+ if(bline.len > 6)
+ return FALSE
+ ranged_cooldown = world.time + 100
+ visible_message("[src] traps [target]!")
+ for(var/turf/J in view(1, target) - get_turf(target))
+ new /obj/effect/temp_visual/bloodwall(J, src)
+ sleep(5)
+ src.bloodcharge(target)
+ var/list/bloodwalls = list()
+ for(var/d in GLOB.cardinals)
+ var/turf/N = get_step(target, d)
+ if(N == get_step(src, src.dir) || N == get_turf(src))
+ continue
+ else
+ for(var/obj/effect/temp_visual/bloodwall/B in N.contents)
+ bloodwalls += B
+ var/obj/effect/temp_visual/bloodwall/chosen = pick(bloodwalls)
+ visible_message("One of the blood walls disappear!")
+ qdel(chosen)
+
+/mob/living/simple_animal/hostile/asteroid/elite/candy/proc/meatshield()
+ ranged_cooldown = world.time + 25
+ playsound(src,'sound/magic/Blind.ogg', 200, 1)
+ visible_message("[src] raises a wall!")
+ var/turf/T = get_turf(get_step(src, src.dir))
+ var/list/hit_things = list()
+ new /obj/effect/temp_visual/bloodwall(T, src)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, L))
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ L.Stun(20)
+ hit_things += L
+ var/turf/otherT = get_step(T, turn(src.dir, 90))
+ for(var/mob/living/L in otherT.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, L))
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ L.Stun(20)
+ hit_things += L
+ if(otherT)
+ new /obj/effect/temp_visual/bloodwall(otherT, src)
+ otherT = get_step(T, turn(src.dir, -90))
+ for(var/mob/living/L in otherT.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, L))
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ L.Stun(20)
+ hit_things += L
+ if(otherT)
+ new /obj/effect/temp_visual/bloodwall(otherT, src)
+
+/mob/living/simple_animal/hostile/asteroid/elite/candy/proc/knockdown()
+ ranged_cooldown = world.time + 100
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ visible_message("[src] clenches his fists and smashes the ground!")
+ var/list/hit_things = list()
+ sleep(10)
+ for(var/turf/T in view(1, src))
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, L))
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ L.Stun(20)
+ L.adjustBruteLoss(50)
+ var/source_turf = src.loc
+ sleep(5)
+ for(var/turf/T in view(2, source_turf) - view(1, source_turf))
+ new /obj/effect/temp_visual/small_smoke/halfsecond(T)
+ for(var/mob/living/L in T.contents)
+ if(L != src && !(L in hit_things))
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, L))
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ L.Stun(20)
+ L.adjustBruteLoss(50)
+
+// Candy helpers
+
+/mob/living/simple_animal/hostile/asteroid/elite/candy/proc/blood_charge_2(var/move_dir, var/times_ran)
+ if(times_ran >= 6)
+ return
+ var/turf/T = get_step(get_turf(src), move_dir)
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled()
+ if(T.density)
+ return
+ for(var/obj/structure/window/W in T.contents)
+ return
+ for(var/obj/machinery/door/D in T.contents)
+ return
+ forceMove(T)
+ playsound(src,'sound/effects/bang.ogg', 200, 1)
+ var/list/hit_things = list()
+ var/throwtarget = get_edge_target_turf(src, move_dir)
+ for(var/mob/living/L in T.contents - hit_things - src)
+ if(faction_check_mob(L))
+ return
+ hit_things += L
+ visible_message("[src] attacks [L] with much force!")
+ to_chat(L, "[src] grabs you and throws you with much force!")
+ L.safe_throw_at(throwtarget, 10, 1, src)
+ //L.Paralyze(20)
+ L.Stun(20) //substituting this for the Paralyze from the line above, because we don't have tg paralysis stuff
+ L.adjustBruteLoss(50)
+ addtimer(CALLBACK(src, .proc/blood_charge_2, move_dir, (times_ran + 1)), 2)
+
+/obj/effect/temp_visual/dir_setting/bloodsplatter/candy
+ duration = 10
+ color = "#FF0000"
+
+/obj/effect/temp_visual/bloodwall
+ name = "blood wall"
+ icon = 'icons/turf/walls/cult_wall.dmi'
+ icon_state = "cult"
+ color = "#FF0000"
+ duration = 50
+ smooth = SMOOTH_TRUE
+ var/mob/living/caster
+
+/obj/effect/temp_visual/bloodwall/Initialize(mapload, new_caster)
+ . = ..()
+ caster = new_caster
+ queue_smooth_neighbors(src)
+ queue_smooth(src)
+
+/obj/effect/temp_visual/bloodwall/Destroy()
+ queue_smooth_neighbors(src)
+ return ..()
+
+/obj/effect/temp_visual/bloodwall/CanPass(atom/movable/mover, turf/target)
+ if(QDELETED(caster))
+ return FALSE
+ if(mover == caster.pulledby)
+ return TRUE
+ if(istype(mover, /obj/item/projectile))
+ var/obj/item/projectile/P = mover
+ if(P.firer == caster)
+ return TRUE
+ if(mover == caster)
+ return TRUE
+ return FALSE
+
+//loot
+
+/obj/item/bloodcrawlbottle
+ name = "bloodlust in a bottle"
+ desc = "Drinking this will give you unimaginable powers... and mildly disgust you because of it's metallic taste."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+/obj/item/bloodcrawlbottle/attack_self(mob/user)
+ to_chat(user, "You drink the bottle's contents.")
+ var/obj/effect/proc_holder/spell/bloodcrawl/S = new /obj/effect/proc_holder/spell/bloodcrawl/
+ user.mind.AddSpell(S)
+ user.log_message("learned the spell bloodcrawl ([S])", LOG_ATTACK, color="orange")
+ qdel(src)
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm
new file mode 100644
index 0000000000..f0766fb116
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/drakeling.dm
@@ -0,0 +1,188 @@
+#define LAVA_MOAT 1
+#define LAVA_AROUND 2
+#define FIRE_SPEW 3
+#define FIRE_MOAT 4
+
+/**
+ * # Drakeling
+ *
+ * A small drake/dragon.
+ * Has four attacks.
+ * - Lava moat - Creates a moat of lava around themselves.
+ * - Lava rivers - Creates lava rivers in all cardinal directions.
+ * - Firespew - Spews fire in the direction they're facing.
+ * - Fire moat - Spews fire in all directions.
+ */
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling
+ name = "Drakeling"
+ desc = "A small but still fearsome dragon."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_elites.dmi'
+ icon_state = "ash_whelp"
+ icon_living = "ash_whelp"
+ icon_aggro = "ash_whelp"
+ icon_dead = "ash_whelp_dead"
+ icon_gib = "syndicate_gib"
+ maxHealth = 800
+ health = 800
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ attack_verb_continuous = "bites"
+ attack_verb_simple = "bite"
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ speed = 1
+ move_to_delay = 3
+ mouse_opacity = MOUSE_OPACITY_ICON
+ deathsound = 'sound/magic/WandODeath.ogg'
+ deathmessage = "'s wings flail weakly until he settles down, dead"
+ loot_drop = /obj/item/borg/upgrade/modkit/fire
+ speak_emote = list("huffs")
+
+ attack_action_types = list(/datum/action/innate/elite_attack/lavamoat,
+ /datum/action/innate/elite_attack/lavaaround,
+ /datum/action/innate/elite_attack/firespew,
+ /datum/action/innate/elite_attack/firemoat)
+ glorymessageshand = list("rips off the little dragon's horns, then shoves them into their mouth!", "grabs the drakeling's head and rips it off violently from their neck with their bare hands!")
+ glorymessagescrusher = list("slashes the drakeling's head in half with their crusher, dividing it in two!")
+ glorymessagespka = list("hits the drakeling's maw repeatedly with the stock of their PKA until it breaks off, then shoots it in the head for good measure!", "grabs the drakeling's neck, and shoots it's head off with their PKA!")
+ glorymessagespkabayonet = list("kicks the drakeling onto the ground belly up, then slices their tummy open with the bayonet as it screams in agony!")
+
+/datum/action/innate/elite_attack/lavamoat
+ name = "Lava Moat"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "lava_moat"
+ chosen_message = "You will attempt to create a lava moat around you."
+ chosen_attack_num = LAVA_MOAT
+
+/datum/action/innate/elite_attack/lavaaround
+ name = "Lava Rivers"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "lava_around"
+ chosen_message = "You will now create lava rivers at your cardinal directions."
+ chosen_attack_num = LAVA_AROUND
+
+/datum/action/innate/elite_attack/firespew
+ name = "Fire Spew"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "fire_spew"
+ chosen_message = "You will now spew fire at your target."
+ chosen_attack_num = FIRE_SPEW
+
+/datum/action/innate/elite_attack/firemoat
+ name = "Fire Moat"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "fire_moat"
+ chosen_message = "You will now spew fire at all cardinal directions."
+ chosen_attack_num = FIRE_MOAT
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/OpenFire()
+ if(client)
+ switch(chosen_attack)
+ if(LAVA_MOAT)
+ lava_moat(target)
+ if(LAVA_AROUND)
+ lava_around(target)
+ if(FIRE_SPEW)
+ fire_spew()
+ if(FIRE_MOAT)
+ fire_moat()
+ return
+ var/aiattack = rand(1,4)
+ switch(aiattack)
+ if(LAVA_MOAT)
+ lava_moat(target)
+ if(LAVA_AROUND)
+ lava_around(target)
+ if(FIRE_SPEW)
+ fire_spew()
+ if(FIRE_MOAT)
+ fire_moat()
+
+//Drakeling actions
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/lava_moat()
+ ranged_cooldown = world.time + 25
+ visible_message("[src] spews lava around themselves! Get back!")
+ for(var/turf/T in oview(1, src))
+ new /obj/effect/temp_visual/lava_warning(T)
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/lava_around()
+ ranged_cooldown = world.time + 50
+ for(var/d in GLOB.cardinals)
+ INVOKE_ASYNC(src, .proc/lava_wall, d, 5)
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/fire_spew()
+ ranged_cooldown = world.time + 25
+ visible_message("[src] spews fire!")
+ playsound(src,'sound/magic/Fireball.ogg', 200, 1)
+ sleep(5)
+ fire_wall(src.dir, 10)
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/fire_moat()
+ ranged_cooldown = world.time + 100
+ playsound(src,'sound/magic/Fireball.ogg', 200, 1)
+ visible_message("[src] violently puffs smoke!They're going to make a fire moat!")
+ sleep(5)
+ for(var/d in GLOB.alldirs)
+ INVOKE_ASYNC(src, .proc/fire_wall, d, 10)
+
+// Drakeling helpers
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/fire_wall(dir, range)
+ var/list/hitlist = list(src)
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to range)
+ new /obj/effect/hotspot(T)
+ T.hotspot_expose(700,50,1)
+ for(var/mob/living/L in T.contents)
+ if(L in hitlist || (L == src))
+ break
+ else
+ hitlist += L
+ L.adjustFireLoss(20)
+ to_chat(L, "You're hit by [src]'s fire breath!")
+ T = get_step(T, dir)
+ sleep(1)
+
+/mob/living/simple_animal/hostile/asteroid/elite/drakeling/proc/lava_wall(dir, range)
+ var/turf/T = get_turf(src)
+ for(var/i in 1 to range)
+ new /obj/effect/temp_visual/lava_warning(T)
+ T = get_step(T, dir)
+ sleep(2)
+
+/obj/effect/temp_visual/lava_warning
+ icon_state = "lavastaff_warn"
+ layer = BELOW_MOB_LAYER
+ light_range = 2
+ duration = 7
+
+/obj/effect/temp_visual/lava_warning/ex_act()
+ return
+
+/obj/effect/temp_visual/lava_warning/Initialize(mapload, reset_time = 40)
+ . = ..()
+ INVOKE_ASYNC(src, .proc/fall, reset_time)
+ src.alpha = 63.75
+ animate(src, alpha = 255, time = duration)
+
+/obj/effect/temp_visual/lava_warning/proc/fall(var/reset_time)
+ var/turf/T = get_turf(src)
+ playsound(T,'sound/magic/fleshtostone.ogg', 80, TRUE)
+ sleep(duration)
+ playsound(T,'sound/magic/fireball.ogg', 200, TRUE)
+ for(var/mob/living/L in T.contents)
+ if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite/drakeling))
+ continue
+ L.adjustFireLoss(10)
+ to_chat(L, "You fall directly into the pool of lava!")
+
+ // deals damage to mechs
+ for(var/obj/mecha/M in T.contents)
+ M.take_damage(45, BRUTE, "melee", 1)
+
+ // changes turf to lava temporarily
+ if(!istype(T, /turf/closed) && !istype(T, /turf/open/lava))
+ var/lava_turf = /turf/open/lava/smooth
+ var/reset_turf = T.type
+ T.ChangeTurf(lava_turf, flags = CHANGETURF_INHERIT_AIR)
+ addtimer(CALLBACK(T, /turf.proc/ChangeTurf, reset_turf, null, CHANGETURF_INHERIT_AIR), reset_time, TIMER_OVERRIDE|TIMER_UNIQUE)
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
new file mode 100644
index 0000000000..ccba5d65a6
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -0,0 +1,43 @@
+/obj/structure/elite_tumor
+ potentialspawns = list(/mob/living/simple_animal/hostile/asteroid/elite/broodmother,
+ /mob/living/simple_animal/hostile/asteroid/elite/pandora,
+ /mob/living/simple_animal/hostile/asteroid/elite/legionnaire,
+ /mob/living/simple_animal/hostile/asteroid/elite/herald,
+ /mob/living/simple_animal/hostile/asteroid/elite/drakeling,
+ /mob/living/simple_animal/hostile/asteroid/elite/candy,
+ /mob/living/simple_animal/hostile/asteroid/elite/minerpriest)
+
+/obj/structure/elite_tumor/priest
+ potentialspawns = list(/mob/living/simple_animal/hostile/asteroid/elite/minerpriest)
+
+/mob/living/simple_animal/hostile/asteroid/elite
+ can_talk = TRUE
+ speak_emote = list("growls")
+ gloryhealth = 50
+ glorymodifier = 0.625
+
+/mob/living/simple_animal/hostile/asteroid/elite/death(gibbed)
+ gibbed = FALSE
+ ..(gibbed)
+
+obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag)
+ . = ..()
+ if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag)
+ var/mob/living/simple_animal/hostile/asteroid/elite/E = target
+ if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key)
+ user.visible_message("It appears [E] is unable to be revived right now. Perhaps try again later.")
+ return
+ E.faction = list("neutral")
+ E.revive(full_heal = TRUE, admin_revive = TRUE)
+ user.visible_message("[user] stabs [E] with [src], reviving it.")
+ E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0)
+ to_chat(E, "You have been revived by [user]. You owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!")
+ E.maxHealth = E.maxHealth * 0.5
+ E.health = E.maxHealth
+ E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people."
+ E.sentience_type = SENTIENCE_ORGANIC
+ E.owner = user
+ qdel(src)
+ else
+ to_chat(user, "[src] only works on the corpse of a sentient lavaland elite.")
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm
new file mode 100644
index 0000000000..a3051cea25
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/fanaticminer.dm
@@ -0,0 +1,259 @@
+#define AXE_SLAM 1
+#define SUMMON_SHAMBLER 2
+#define DASH 3
+#define AXE_THROW 4
+
+/**
+ * # Necropolis priest
+ *
+ * Kind of like BD miner's son trying to impress their dad.
+ * Has four attacks.
+ * - Axe Slam - Slams his axe on the ground, hurting everyone is his direction in a 3 tile radius
+ * - Summon Shambler - Summons a shambling miner that focuses on the target.
+ * - Dash - Dashes in the target's general direction
+ * - Axe Throw - Throws an axe at the target
+ */
+
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest
+ name = "Necropolis Priest"
+ desc = "Once used to be a miner, now a worshipper of the necropolis."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_elites.dmi'
+ icon_state = "minerpriest"
+ icon_living = "minerpriest"
+ icon_aggro = "minerpriest"
+ icon_dead = "minerpriest_dead"
+ icon_gib = "syndicate_gib"
+ maxHealth = 800
+ health = 800
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ attack_verb_continuous = "slashes"
+ attack_verb_simple = "slash"
+ attack_sound = 'sound/weapons/slash.ogg'
+ speed = 1
+ move_to_delay = 2
+ mouse_opacity = MOUSE_OPACITY_ICON
+ deathsound = 'sound/voice/human/manlaugh1.ogg'
+ deathmessage = "realizes what they've been doing all this time, and return to their true self."
+ loot_drop = /obj/item/melee/diamondaxe
+ speak_emote = list("yells")
+ del_on_death = TRUE
+ projectiletype = /obj/item/projectile/kinetic/axe
+ attack_action_types = list(/datum/action/innate/elite_attack/axe_slam,
+ /datum/action/innate/elite_attack/summon_shambler,
+ /datum/action/innate/elite_attack/dash,
+ /datum/action/innate/elite_attack/axe_throw)
+ glorymessageshand = list("grabs the priest's arm and breaks it, exposing sharp bone which is promptly shoved inside their skull!", "punches into the priest's guts, ripping off their stomach and whatever else was inside!")
+ glorymessagescrusher = list("chops the priest's leg off with their crusher, then uses it to beat their skull open while they're downed!")
+ glorymessagespka = list("shoots at the priest's hand, exploding it and making them let go of their axe, which is promptly grabbed and slashes their neck open!", "kicks the priest on the ground, then shoots their guts and viscera off with a PKA blast to the chest!")
+ glorymessagespkabayonet = list("stabs through the priest's heart and pulls it out, letting them see one last beat before they die!")
+
+/datum/action/innate/elite_attack/axe_slam
+ name = "Axe Slam"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "axe_slam"
+ chosen_message = "You will attempt to slam your axe."
+ chosen_attack_num = AXE_SLAM
+
+/datum/action/innate/elite_attack/summon_shambler
+ name = "Summon Shambler"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "summon_shambler"
+ chosen_message = "You will attempt to summon a shambling miner."
+ chosen_attack_num = SUMMON_SHAMBLER
+
+/datum/action/innate/elite_attack/dash
+ name = "Dash"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "dash"
+ chosen_message = "You will attempt to dash near your target."
+ chosen_attack_num = DASH
+
+/datum/action/innate/elite_attack/axe_throw
+ name = "Axe Throw"
+ icon_icon = 'sandcode/icons/mob/actions/actions_elites.dmi'
+ button_icon_state = "axe_throw"
+ chosen_message = "You will attempt to throw your axe."
+ chosen_attack_num = AXE_THROW
+
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest/OpenFire()
+ if(client)
+ switch(chosen_attack)
+ if(AXE_SLAM)
+ axe_slam(target)
+ if(SUMMON_SHAMBLER)
+ summon_shambler(target)
+ if(DASH)
+ dash(target)
+ if(AXE_THROW)
+ axe_throw(target)
+ return
+ var/aiattack = rand(1,4)
+ switch(aiattack)
+ if(AXE_SLAM)
+ axe_slam(target)
+ if(SUMMON_SHAMBLER)
+ summon_shambler(target)
+ if(DASH)
+ dash(target)
+ if(AXE_THROW)
+ axe_throw(target)
+
+// priest actions
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/axe_slam(target)
+ ranged_cooldown = world.time + 30
+ var/dir_to_target = get_dir(get_turf(src), get_turf(target))
+ var/turf/T = get_step(get_turf(src), dir_to_target)
+ for(var/i in 1 to 3)
+ new /obj/effect/temp_visual/dragon_swoop/priest(T)
+ T = get_step(T, dir_to_target)
+ visible_message("[src] prepares to slam his axe!")
+ sleep(5)
+ playsound(src,'sound/misc/crunch.ogg', 200, 1)
+ T = get_step(get_turf(src), dir_to_target)
+ var/list/hit_things = list()
+ visible_message("[src] slams his axe!")
+ for(var/i in 1 to 3)
+ for(var/mob/living/L in T.contents)
+ if(faction_check_mob(L))
+ return
+ hit_things += L
+ visible_message("[src] slams his axe on [L]!")
+ to_chat(L, "[src] slams his axe on you!")
+ L.Stun(15)
+ L.adjustBruteLoss(30)
+ T = get_step(T, dir_to_target)
+
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/summon_shambler(target)
+ ranged_cooldown = world.time + 150
+ visible_message("[src] summons a minion!")
+ playsound(src,'sound/magic/CastSummon.ogg', 200, 1)
+ var/list/turfs = list()
+ for(var/turf/T in oview(2, src))
+ turfs += T
+ var/turf/pick1 = pick(turfs)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(pick1)
+ var/mob/living/simple_animal/hostile/asteroid/miner/m1 = new /mob/living/simple_animal/hostile/asteroid/miner(pick1)
+ m1.faction = faction.Copy()
+ m1.GiveTarget(target)
+
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/dash(atom/dash_target)
+ ranged_cooldown = world.time + 20
+ visible_message("[src] dashes into the air!")
+ playsound(src,'sound/magic/blink.ogg', 200, 1)
+ var/list/accessable_turfs = list()
+ var/self_dist_to_target = 0
+ var/turf/own_turf = get_turf(src)
+ if(!QDELETED(dash_target))
+ self_dist_to_target += get_dist(dash_target, own_turf)
+ for(var/turf/open/O in RANGE_TURFS(4, own_turf))
+ var/turf_dist_to_target = 0
+ if(!QDELETED(dash_target))
+ turf_dist_to_target += get_dist(dash_target, O)
+ if(get_dist(src, O) <= 4 && turf_dist_to_target <= self_dist_to_target && !islava(O) && !ischasm(O))
+ var/valid = TRUE
+ for(var/turf/T in getline(own_turf, O))
+ if(is_blocked_turf(T, TRUE))
+ valid = FALSE
+ continue
+ if(valid)
+ accessable_turfs[O] = turf_dist_to_target
+ var/turf/target_turf
+ if(!QDELETED(dash_target))
+ var/closest_dist = 4
+ for(var/t in accessable_turfs)
+ if(accessable_turfs[t] < closest_dist)
+ closest_dist = accessable_turfs[t]
+ for(var/t in accessable_turfs)
+ if(accessable_turfs[t] != closest_dist)
+ accessable_turfs -= t
+ if(!LAZYLEN(accessable_turfs))
+ return
+ target_turf = pick(accessable_turfs)
+ var/turf/step_back_turf = get_step(target_turf, -(src.dir))
+ new /obj/effect/temp_visual/small_smoke/halfsecond(step_back_turf)
+ new /obj/effect/temp_visual/small_smoke/halfsecond(own_turf)
+ forceMove(step_back_turf)
+ return TRUE
+
+
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest/proc/axe_throw(target)
+ ranged_cooldown = world.time + 20
+ visible_message("[src] prepares to throw his axe!")
+ var/turf/targetturf = get_turf(target)
+ playsound(src,'sound/weapons/fwoosh.wav', 200, 1)
+ Shoot(targetturf)
+ new /obj/item/melee/diamondaxe/priest(targetturf)
+
+/mob/living/simple_animal/hostile/asteroid/elite/minerpriest/drop_loot()
+ var/mob/living/carbon/human/H = new /mob/living/carbon/human(src.loc)
+ if(src.client)
+ H.client = src.client
+ to_chat(H, "You have been finally enlightened. Serving the necropolis is not your duty anymore, thanks to whoever defeated you. You owe them a great debt.Note that you now share the loyalties of the one who defeated you. You are expected not to intentionally sabotage their faction unless commanded to!")
+ else
+ H.adjustBruteLoss(200)
+ H.equipOutfit(/datum/outfit/job/miner/equipped/priest)
+
+// priest helpers
+/datum/outfit/job/miner/equipped/priest
+ name = "Shaft Miner (Necropolis Priest)"
+ shoes = /obj/item/clothing/shoes/bronze
+ mask = /obj/item/clothing/mask/gas
+ backpack_contents = list(
+ /obj/item/flashlight/seclite=1,\
+ /obj/item/kitchen/knife/combat/survival=1,
+ /obj/item/mining_voucher=1,
+ /obj/item/t_scanner/adv_mining_scanner/lesser=1,
+ /obj/item/gun/energy/kinetic_accelerator=1,\
+ /obj/item/stack/marker_beacon/ten=1,
+ /obj/item/melee/diamondaxe = 1,
+ /obj/item/clothing/head/bronze = 1,
+ /obj/item/clothing/suit/bronze = 1)
+
+/obj/effect/temp_visual/dragon_swoop/priest
+ duration = 5
+ color = rgb(255,0,0)
+
+/obj/effect/temp_visual/dragon_swoop/priest/Initialize()
+ . = ..()
+ transform *= 0.33
+
+/obj/item/projectile/kinetic/axe
+ name = "kinetic axe"
+ damage = 20
+ damage_type = BRUTE
+ color = "#00FFFF"
+
+/obj/item/projectile/kinetic/axe/prehit(atom/target)
+ return
+
+//loot
+
+/obj/item/melee/diamondaxe
+ name = "Priest's Axe"
+ desc = "Used to be a diamond pickaxe, now there's no pick, just axe."
+ icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
+ icon_state = "diamondaxe"
+ lefthand_file = 'sandcode/icons/mob/inhands/weapons/axes_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/weapons/axes_righthand.dmi'
+ item_state = "diamondaxe"
+ attack_verb = list("slashed", "sliced", "torn", "ripped", "diced", "cut")
+ w_class = WEIGHT_CLASS_BULKY
+ force = 20
+ throwforce = 18
+ embedding = list("embedded_pain_multiplier" = 3, "embed_chance" = 90, "embedded_fall_chance" = 50)
+ armour_penetration = 50
+ block_chance = 25
+ sharpness = IS_SHARP
+ hitsound = 'sound/weapons/slash.ogg'
+
+/obj/item/melee/diamondaxe/Initialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 50, 100, null, null, TRUE)
+
+/obj/item/melee/diamondaxe/priest
+
+/obj/item/melee/diamondaxe/priest/Initialize()
+ ..()
+ QDEL_IN(src, 30)
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
new file mode 100644
index 0000000000..e6fc6e0cc0
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/hostile/asteroid/elite/broodmother
+ glorymessageshand = list("punches through the broodmother's womb, ripping out a little goliath which is promptly shoved on their mouth!", "rips off the broodmother's tentacles by hand, then knees their head until it caves in!")
+ glorymessagescrusher = list("rams the broodmother's torso the hilt of their crusher, which they promptly lift up and let gravity impale the broodmother!")
+ glorymessagespka = list("shoots the broodmother's face, exploding it!")
+ glorymessagespkabayonet = list("stabs the broodmother's eye and gouges it out, shoving it into their maw, making them eat it!")
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
new file mode 100644
index 0000000000..5f8e19dcea
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/hostile/asteroid/elite/herald
+ glorymessageshand = list("grabs the herald by it's legs and smashes it repeatedly on the ground, bits and pieces of flesh flying off until it dies!")
+ glorymessagescrusher = list("chops the herald's 'ear' with the crusher, then shoves the hilt of it so hard down their throat that it goes through their whole body and they fucking die!")
+ glorymessagespka = list("parries a bolt of the herald with a PKA blast, which comes flying back onto them and slashes off their head!")
+ glorymessagespkabayonet = list("stabs the herald repeatedly in the torso, then into their skull for good measure!")
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
new file mode 100644
index 0000000000..5614256c80
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/hostile/asteroid/elite/legionnaire
+ glorymessageshand = list("grabs the legionnaire's skull and rips it off, bashing them with it until they break apart and die!")
+ glorymessagescrusher = list("chops off both of the legionnaire's legs with the crusher in one single move, then stabs through their angry flying head with the hilt of it!")
+ glorymessagespka = list("shoots the legionnaire's skull which fucking explodes, and then shoots the ribcage of the angry body which also explodes!")
+ glorymessagespkabayonet = list("stabs through the legionnaire's skull with the bayonet, which they promptly bash the rest of the body into dust with!")
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
new file mode 100644
index 0000000000..d5b81e8ba9
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -0,0 +1,6 @@
+/mob/living/simple_animal/hostile/asteroid/elite/pandora
+ glorymessageshand = list("grabs the pandora and closes it for good!")
+ glorymessagescrusher = list("chops the pandora by their neck, the head flying off!")
+ glorymessagespka = list("shoots the pandora's head until it closes for good!")
+ glorymessagespkabayonet = list("stabs through the pandora repeatedly, until it closes itself!")
+//at this point i'm legitimately tired i dont care aaaaaaaaaaa
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
new file mode 100644
index 0000000000..ef982f345d
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/hostile/asteroid/goldgrub
+ glorymessageshand = list("rips out the goldgrub's eyes, and sticks them into his mouth hole!", "violently opens the goldgrub's mouth open, then sticks one hand inside and rips out their ore-filled stomach!")
+ glorymessagespka = list("bashes the shit out of the golgrub with their PKA, gushing green blood everywhere!", "sticks their pka into the goldgrub's mouth and shoots, exploding it and showering everything in ore and gore!")
+ glorymessagespkabayonet = list("grabs the goldgrub with one hand and slices their stomach with the pka's bayonet, spilling ore and guts everywhere!", "climbs on the goldgrub, and repeatedly stabs it's head with the bayonet, spilling green blood on the ground, until it stops moving!")
+ glorymessagescrusher = list("chops the goldgrub's head off with their crusher!", "chops the goldgrub repeatedly with their crusher, until all that is left is a bunch of golden and green pieces of meat, as well as some ore.")
\ No newline at end of file
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
new file mode 100644
index 0000000000..b9b453765b
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -0,0 +1,5 @@
+/mob/living/simple_animal/hostile/asteroid/goliath
+ glorymessageshand = list("punches violently into the goliath's skull, ripping out what could be described as their brain!", "rips off one of the goliath's tentacles bare-handed, then whips them with it until they die in humiliation!", "stomps their boot hard down on the goliath's jaw, ripping one of its fangs off with their hand and stabbing it in the eye")
+ glorymessagespka = list("climbs on top of the goliath, then shoots their skull open in a violent blast with their pka!")
+ glorymessagespkabayonet = list("stabs the goliath's eyes out with their bayonet, then sticks them into the beast's mouth!", "slices off many of the tentacles of the goliath with their bayonet, until it finally gives out!")
+ glorymessagescrusher = list("crushers the face of the goliath in one swift move with their crusher!")
\ No newline at end of file
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
new file mode 100644
index 0000000000..28764b5dd4
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -0,0 +1,8 @@
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion
+ glorymessageshand = list("rips out skulls from the legion, one by one, until it's mangled carcass finally disappears!", "punches the shit out of the legion, making it scream until it finally gives out!", "punches their hand inside the gut of the legion, ripping off his regenerative core!")
+ glorymessagespka = list("grabs the legion by it's arm with one hand, then shoots their gut repeatedly with their PKA!", "bashes the legion's skulls hard with their pka, until they crack and go inside their cursed host!")
+ glorymessagespkabayonet = list("stabs the legion's gut and pulls out their regenerative core!", "repeatedly stabs the legion in their \"head\" with the PKA's bayonet!", "rams the bayonet of their Kinetic Accelerator up the Legion's chin, lifting it up and then firing it, blowing its head off!")
+ glorymessagescrusher = list("chops the legion's hip like it's timber, until it finally gives out!", "kicks the legion onto the ground, then chops their face apart with their crusher!")
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood //just to be sure
+ gloryhealth = 0
\ No newline at end of file
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm
new file mode 100644
index 0000000000..1a71f3aec8
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/imp.dm
@@ -0,0 +1,81 @@
+//A speedy, annoying and scaredy demon
+/mob/living/simple_animal/hostile/asteroid/imp
+ name = "lava imp"
+ desc = "Lowest on the hierarchy of slaughter demons, this one is still nothing to sneer at."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "imp"
+ icon_living = "imp"
+ icon_aggro = "imp"
+ icon_dead = "imp_dead"
+ icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
+ move_to_delay = 4
+ projectiletype = /obj/item/projectile/magic/impfireball
+ projectilesound = 'sandcode/sound/misc/impranged.wav'
+ ranged = 1
+ ranged_message = "shoots a fireball"
+ ranged_cooldown_time = 70
+ throw_message = "does nothing against the hardened skin of"
+ vision_range = 5
+ speed = 1
+ maxHealth = 150
+ health = 150
+ harm_intent_damage = 15
+ obj_damage = 60
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ attack_verb_continuous = "claws"
+ attack_verb_simple = "claw"
+ a_intent = INTENT_HARM
+ speak_emote = list("groans")
+ attack_sound = 'sandcode/sound/misc/impattacks.wav'
+ aggro_vision_range = 15
+ retreat_distance = 5
+ gold_core_spawnable = HOSTILE_SPAWN
+ crusher_loot = /obj/item/crusher_trophy/blaster_tubes/impskull
+ loot = list()
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 2, /obj/item/stack/sheet/bone = 4)
+ robust_searching = FALSE
+ death_sound = 'sandcode/sound/misc/impdies.wav'
+ glorymessageshand = list("grabs the imp's eyes and rips them out, shoving the bloody imp aside!", "grabs and crushes the imp's skull apart with their bare hands!", "rips the imp's head clean off with their bare hands!")
+ glorymessagespka = list("sticks their PKA into the imp's mouth and shoots it, showering everything in gore!", "bashes the imp's head into their chest with their PKA!", "shoots off both legs of the imp with their PKA!")
+ glorymessagespkabayonet = list("slices the imp's head off by the neck with the PKA's bayonet!", "repeatedly stabs the imp in their gut with the PKA's bayonet!")
+ glorymessagescrusher = list("chops the imp horizontally in half with their crusher in one swift move!", "chops off the imp's legs with their crusher and kicks their face hard, exploding it while they're in the air!", "slashes each of the imp's arms off by the shoulder with their crusher!")
+
+/mob/living/simple_animal/hostile/asteroid/imp/attacked_by(obj/item/I, mob/living/user)
+ . = ..()
+ playsound(src, 'sandcode/sound/misc/impinjured.wav', rand(25,100), -1) //HURT ME PLENTY
+
+/mob/living/simple_animal/hostile/asteroid/imp/bullet_act(obj/item/projectile/P)
+ . = ..()
+ playsound(src, 'sandcode/sound/misc/impinjured.wav', rand(25,100), -1)
+
+/mob/living/simple_animal/hostile/asteroid/imp/Aggro()
+ . = ..()
+ playsound(src, pick('sandcode/sound/misc/impsight.wav', 'sandcode/sound/misc/impsight2.wav'), rand(50,75), -1)
+
+/mob/living/simple_animal/hostile/asteroid/imp/LoseAggro()
+ . = ..()
+ playsound(src, pick('sandcode/sound/misc/impnearby.wav', 'sandcode/sound/misc/impnearby.wav'), rand(25, 60), -1)
+
+/obj/item/projectile/magic/impfireball //bobyot y u no use child of fireball
+ name = "demonic fireball" //because it fucking explodes and deals brute damage even when values are set to -1
+ icon_state = "fireball"
+ damage = 10
+ damage_type = BURN
+ nodamage = 0
+ armour_penetration = 20
+ var/firestacks = 5
+
+/obj/item/projectile/magic/impfireball/on_hit(target)
+ . = ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.adjust_fire_stacks(firestacks)
+ C.IgniteMob()
+ if(C.stat != DEAD && C.stat != UNCONSCIOUS)
+ playsound(C, 'sandcode/sound/misc/doominjured.wav', 100, -1)
+ else if(C.stat == DEAD)
+ playsound(C, 'sandcode/sound/misc/doomdies.wav', 100, -1)
+ else
+ playsound(C, pick('sandcode/sound/misc/doomscream.wav', 'sandcode/sound/misc/doomscream2.wav'), 100, -1)
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm
new file mode 100644
index 0000000000..7f2b4ee1ef
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/miningmobs.dm
@@ -0,0 +1,68 @@
+/mob/living/simple_animal/hostile/asteroid
+ var/glorykill = FALSE //CAN THIS MOTHERFUCKER BE SNAPPED IN HALF FOR HEALTH?
+ var/list/glorymessageshand = list() //WHAT THE FUCK ARE THE MESSAGES SAID BY THIS FUCK WHEN HE'S GLORY KILLED WITH AN EMPTY HAND?
+ var/list/glorymessagescrusher = list() //SAME AS ABOVE BUT CRUSHER
+ var/list/glorymessagespka = list() //SAME AS ABOVE THE ABOVE BUT PKA
+ var/list/glorymessagespkabayonet = list() //SAME AS ABOVE BUT WITH A HONKING KNIFE ON THE FUCKING THING
+ var/gloryhealth = 7.5
+ var/glorymodifier = 1.5
+
+/mob/living/simple_animal/hostile/asteroid/Life()
+ ..()
+ if(health <= (maxHealth/10 * glorymodifier) && !glorykill && stat != DEAD)
+ glorykill = TRUE
+ glory()
+ else if(health > (maxHealth/10 * glorymodifier) && glorykill && stat != DEAD)
+ glorykill = FALSE
+ unglory()
+
+/mob/living/simple_animal/hostile/asteroid/proc/glory()
+ desc += "
[src] is staggered and can be glory killed!"
+ animate(src, color = "#00FFFF", time = 5)
+
+/mob/living/simple_animal/hostile/asteroid/proc/unglory()
+ desc = initial(desc)
+ animate(src, color = initial(color), time = 5)
+
+/mob/living/simple_animal/hostile/asteroid/death(gibbed)
+ animate(src, color = initial(color), time = 3)
+ desc = initial(desc)
+ SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type)
+ var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
+ if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item
+ spawn_crusher_loot()
+ ..(gibbed)
+
+/mob/living/simple_animal/hostile/asteroid/AltClick(mob/living/carbon/slayer)
+ if(glorykill)
+ if(ranged)
+ if(ranged_cooldown >= world.time)
+ ranged_cooldown += 10
+ else
+ ranged_cooldown = 10 + world.time
+ if(glorykill)
+ if(do_after(slayer, 10, needhand = TRUE, target = src, progress = FALSE) && (stat != DEAD))
+ var/message
+ if(!slayer.get_active_held_item() || (!istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher) && !istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator)))
+ message = pick(glorymessageshand)
+ else if(istype(slayer.get_active_held_item(), /obj/item/kinetic_crusher))
+ message = pick(glorymessagescrusher)
+ else if(istype(slayer.get_active_held_item(), /obj/item/gun/energy/kinetic_accelerator))
+ message = pick(glorymessagespka)
+ var/obj/item/gun/energy/kinetic_accelerator/KA = get_active_held_item()
+ if(KA && KA.bayonet)
+ message = pick(glorymessagespka | glorymessagespkabayonet)
+ if(message)
+ visible_message("[slayer] [message]")
+ else
+ visible_message("[slayer] does something generally considered brutal to [src]... Whatever that may be!")
+ slayer.heal_overall_damage(gloryhealth,gloryhealth)
+ playsound(src.loc, death_sound, 150, TRUE, -1)
+ crusher_drop_mod *= 2
+ adjustHealth(maxHealth, TRUE, TRUE)
+ if(mob_biotypes & MOB_ORGANIC)
+ new /obj/effect/gibspawner/generic(src.loc)
+ else if(mob_biotypes & MOB_ROBOTIC)
+ new /obj/effect/gibspawner/robot(src.loc)
+ else
+ to_chat(slayer, "You fail to glory kill [src]!")
diff --git a/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm
new file mode 100644
index 0000000000..7c10f0b03c
--- /dev/null
+++ b/sandcode/code/modules/mob/living/simple_animal/hostile/mining_mobs/shamblingminer.dm
@@ -0,0 +1,47 @@
+//A slow, melee, crazy miner.
+/mob/living/simple_animal/hostile/asteroid/miner
+ name = "shambling miner"
+ desc = "Consumed by the ash storm, this shell of a human being only seeks to harm those he once called coworkers."
+ icon = 'sandcode/icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "miner"
+ icon_living = "miner"
+ icon_aggro = "miner"
+ icon_dead = "miner_dead"
+ icon_gib = "syndicate_gib"
+ mob_biotypes = MOB_ORGANIC|MOB_BEAST
+ mouse_opacity = MOUSE_OPACITY_OPAQUE
+ ranged = 0
+ friendly_verb_continuous = "hugs"
+ friendly_verb_simple = "hug"
+ speak_emote = list("moans")
+ speed = 1
+ move_to_delay = 3
+ maxHealth = 200
+ health = 200
+ obj_damage = 100
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+ attack_verb_continuous = "smashes"
+ attack_verb_simple = "smash"
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ throw_message = "barely affects the"
+ vision_range = 3
+ aggro_vision_range = 7
+ move_force = MOVE_FORCE_VERY_STRONG
+ move_resist = MOVE_FORCE_VERY_STRONG
+ pull_force = MOVE_FORCE_VERY_STRONG
+ loot = list()
+ crusher_loot = /obj/item/crusher_trophy/blaster_tubes/mask
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/human = 2, /obj/item/stack/sheet/animalhide/human = 1, /obj/item/stack/sheet/bone = 1)
+ robust_searching = FALSE
+ footstep_type = FOOTSTEP_MOB_SHOE
+ minimum_distance = 1
+ glorymessageshand = list("grabs the miner's eyes and rips them out, shoving the bloody miner aside!", "grabs and crushes the miner's skull apart with their bare hands!", "rips the miner's head clean off with their bare hands!")
+ glorymessagespka = list("sticks their PKA into the miner's mouth and shoots it, showering everything in gore!", "bashes the miner's head into their chest with their PKA!", "shoots off both legs of the miner with their PKA!")
+ glorymessagespkabayonet = list("slices the imp's head off by the neck with the PKA's bayonet!", "repeatedly stabs the miner in their gut with the PKA's bayonet!")
+ glorymessagescrusher = list("chops the miner horizontally in half with their crusher in one swift move!", "chops off the miner's legs with their crusher and kicks their face hard, exploding it while they're in the air!", "slashes each of the miner's arms off by the shoulder with their crusher!")
+
+/mob/living/simple_animal/hostile/asteroid/miner/death(gibbed)
+ . = ..()
+ if(prob(15))
+ new /obj/item/kinetic_crusher(src.loc)
diff --git a/sandcode/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/sandcode/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
new file mode 100644
index 0000000000..c5cbe4fd2b
--- /dev/null
+++ b/sandcode/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -0,0 +1,395 @@
+//Kinetic accelerator charging meme bugfix
+/obj/item/gun/energy/kinetic_accelerator/
+ var/chargetimer = null
+
+/obj/item/gun/energy/kinetic_accelerator/proc/reload()
+ if(ismob(loc) || isturf(loc)) //Kinetic accelerators won't charge inside objects. Period.
+ cell.give(cell.maxcharge)
+ if(!suppressed)
+ playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ else
+ to_chat(loc, "[src] silently charges up.")
+ update_icon()
+ overheat = FALSE
+ else //this is a terrible solution, but it ensures that it wont be stuck on dischaged if it fails to reload in an obj
+ if(chargetimer)
+ deltimer(chargetimer)
+ chargetimer = addtimer(CALLBACK(src, .proc/reload), overheat_time * 2, TIMER_STOPPABLE)
+
+//BDM pka
+/obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer
+ name = "bloody accelerator"
+ desc = "A modded premium kinetic accelerator with an increased mod capacity as well as lesser cooldown."
+ icon = 'sandcode/icons/obj/guns/energy.dmi'
+ icon_state = "bdpka"
+ item_state = "kineticgun"
+ overheat_time = 14.5
+ ammo_type = list(/obj/item/ammo_casing/energy/kinetic/premium/bdminer)
+ max_mod_capacity = 125
+
+/obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer/attackby(obj/item/I, mob/user) //Intelligent solutions didn't work, i had to shitcode.
+ if(istype(I, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/MK = I
+ switch(MK.type)
+ if(/obj/item/borg/upgrade/modkit/chassis_mod)
+ to_chat(user, "This modkit is unsuitable for [src]!")
+ return FALSE
+ if(/obj/item/borg/upgrade/modkit/chassis_mod/orange)
+ to_chat(user, "This modkit is unsuitable for [src]!")
+ return FALSE
+ if(/obj/item/borg/upgrade/modkit/tracer)
+ to_chat(user, "This modkit is unsuitable for [src]!")
+ return FALSE
+ if(/obj/item/borg/upgrade/modkit/tracer/adjustable)
+ to_chat(user, "This modkit is unsuitable for [src]!")
+ return FALSE
+ MK.install(src, user)
+ else
+ ..()
+
+/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/gun/energy/kinetic_accelerator))
+ if(istype(A, /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer)) //Read above.
+ var/obj/item/borg/upgrade/modkit/MK = src
+ switch(MK.type)
+ if(/obj/item/borg/upgrade/modkit/chassis_mod)
+ to_chat(user, "This modkit is unsuitable for [A]!")
+ return FALSE
+ if(/obj/item/borg/upgrade/modkit/chassis_mod/orange)
+ to_chat(user, "This modkit is unsuitable for [A]!")
+ return FALSE
+ if(/obj/item/borg/upgrade/modkit/tracer)
+ to_chat(user, "This modkit is unsuitable for [A]!")
+ return FALSE
+ if(/obj/item/borg/upgrade/modkit/tracer/adjustable)
+ to_chat(user, "This modkit is unsuitable for [A]!")
+ return FALSE
+ install(A, user)
+ else
+ ..()
+
+/obj/item/gun/energy/kinetic_accelerator/nopenalty
+ desc = "A self recharging, ranged mining tool that does increased damage in low pressure. This one feels a bit heavier than usual."
+ ammo_type = list(/obj/item/projectile/kinetic/nopenalty)
+
+/obj/item/projectile/kinetic/nopenalty
+
+/obj/item/projectile/kinetic/nopenalty/prehit(atom/target)
+ if(kinetic_gun)
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_prehit(src, target, kinetic_gun)
+ return TRUE
+
+/obj/item/projectile/kinetic/nopenalty/strike_thing(atom/target)
+ var/turf/target_turf = get_turf(target)
+ if(!target_turf)
+ target_turf = get_turf(src)
+ if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike_predamage(src, target_turf, target, kinetic_gun)
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike(src, target_turf, target, kinetic_gun)
+
+/obj/item/ammo_casing/energy/kinetic/premium/bdminer
+ projectile_type = /obj/item/projectile/kinetic/premium/bdminer
+
+/obj/item/projectile/kinetic/premium/bdminer
+ name = "bloody kinetic force"
+ icon_state = "ka_tracer"
+ color = "#FF0000"
+ damage = 50
+ damage_type = BRUTE
+ flag = "bomb"
+ range = 4
+ log_override = TRUE
+
+//Megafauna & other unique modkits
+
+//bubblegum
+/obj/item/borg/upgrade/modkit/shotgun
+ name = "shotgun blast modification kit"
+ desc = "Makes you fire 3 kinetic shots instead of one."
+ denied_type = /obj/item/borg/upgrade/modkit/aoe
+ cost = 40
+ modifier = 3
+
+/obj/item/borg/upgrade/modkit/shotgun/modify_projectile(obj/item/projectile/kinetic/K)
+ ..()
+ if(K.kinetic_gun)
+ var/obj/item/gun/energy/kinetic_accelerator/KA = K.kinetic_gun
+ var/obj/item/ammo_casing/energy/kinetic/C = KA.ammo_type[1]
+ C.pellets = src.modifier
+ C.variance = 45
+ KA.chambered = C
+
+/obj/item/borg/upgrade/modkit/shotgun/uninstall(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
+ ..()
+ var/obj/item/ammo_casing/energy/kinetic/C = KA.ammo_type[1]
+ C.pellets = initial(C.pellets)
+ C.variance = initial(C.variance)
+ KA.chambered = C
+
+//drake
+/obj/item/borg/upgrade/modkit/knockback
+ name = "knockback modification kit"
+ desc = "Makes your shots deal knockback."
+ cost = 25
+ modifier = 1
+ var/burndam = 5
+
+/obj/item/borg/upgrade/modkit/knockback/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ ..()
+ var/mob/living/simple_animal/T = target
+ if(T.stat != DEAD)
+ playsound(T, 'sound/magic/fireball.ogg', 20, 1)
+ new /obj/effect/temp_visual/fire(T.loc)
+ step(target, get_dir(K, T))
+ T.adjustFireLoss(burndam, forced = TRUE)
+
+//hierophant
+
+//warning: spaghetti (and copypasted) code ahead.
+
+/obj/item/borg/upgrade/modkit/wall
+ name = "wall modification kit"
+ desc = "Makes a wall on impact on a living being."
+ cost = 60
+ var/cooldown = 0
+ var/cdmultiplier = 1.75
+
+/obj/item/borg/upgrade/modkit/wall/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ ..()
+ for(var/turf/T in getline(KA.loc, target.loc))
+ new /obj/effect/temp_visual/hierophant/squares(T)
+ if(istype(target, /mob/living))
+ new /obj/effect/temp_visual/hierophant/telegraph/teleport(target.loc)
+ if(istype(target, /mob/living/simple_animal) && ( world.time > cooldown))
+ var/mob/living/F = K.firer
+ var/dir_to_target = get_dir(F, target)
+ var/turf/T = get_step(get_turf(F), dir_to_target)
+ var/obj/effect/temp_visual/hierophant/wall/crusher/W = new /obj/effect/temp_visual/hierophant/wall/crusher(T, F) //a wall only you can pass!
+ cooldown = world.time + (W.duration * cdmultiplier)
+ var/turf/otherT = get_step(T, turn(F.dir, 90))
+ if(otherT)
+ new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, F)
+ otherT = get_step(T, turn(F.dir, -90))
+ if(otherT)
+ new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, F)
+
+//colossus
+
+//essentially a penalty-less version of the rapid repeater
+
+/obj/item/borg/upgrade/modkit/bolter
+ name = "death bolt modification kit"
+ desc = "Makes your shots reload faster if you hit a mob or mineral."
+ cost = 50
+ modifier = 0.4
+
+/obj/item/borg/upgrade/modkit/bolter/modify_projectile(obj/item/projectile/kinetic/K)
+ ..()
+ K.name = "kinetic bolt"
+ K.icon_state = "chronobolt"
+
+/obj/item/borg/upgrade/modkit/bolter/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ ..()
+ var/valid_repeat = FALSE
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat != DEAD)
+ valid_repeat = TRUE
+ if(ismineralturf(target_turf))
+ valid_repeat = TRUE
+ if(valid_repeat)
+ KA.overheat = FALSE
+ KA.attempt_reload(KA.overheat_time * src.modifier)
+
+//legion
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/explosivelegion
+ name = "explosive legion skull"
+ desc = "Oh no."
+ icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
+ icon_state = "legion_head"
+ icon_living = "legion_head"
+ icon_aggro = "legion_head"
+ icon_dead = "legion_head"
+ icon_gib = "syndicate_gib"
+ friendly_verb_continuous = "buzzes near"
+ friendly_verb_simple = "buzz near"
+ vision_range = 10
+ maxHealth = 5
+ health = 5
+ harm_intent_damage = 20
+ melee_damage_lower = 20
+ melee_damage_upper = 20
+ attack_verb_continuous = "bites"
+ attack_verb_simple = "bite"
+ speak_emote = list("echoes")
+ attack_sound = 'sound/weapons/pierce.ogg'
+ throw_message = "is shrugged off by"
+ pass_flags = PASSTABLE
+ del_on_death = TRUE
+ stat_attack = CONSCIOUS
+ robust_searching = 1
+ var/can_infest_dead = FALSE
+ faction = list("explosive")
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/explosivelegion/death()
+ explosion(src.loc, 0, 0, 1, 2, 0, FALSE, 2)
+ src.visible_message("The [src] explodes!")
+ ..()
+
+/obj/item/borg/upgrade/modkit/skull
+ name = "skull launcher modification kit"
+ desc = "Makes your shots create an explosive legion skull on impact. Can backfire."
+ cost = 50
+
+/obj/item/borg/upgrade/modkit/skull/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ ..()
+ if(isliving(target))
+ if(istype(target, /mob/living/simple_animal))
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/explosivelegion/L = new(get_step(target, target.dir))
+ L.GiveTarget(target)
+
+//blood drunk miner
+/obj/item/borg/upgrade/modkit/lifesteal/miner
+ name = "resonant lifesteal crystal"
+ desc = "Causes kinetic accelerator shots to heal the firer on striking a living target."
+ modifier = 4
+ cost = 30
+
+//drakeling
+/obj/item/borg/upgrade/modkit/fire
+ name = "flamethrower modification kit"
+ desc = "Makes your kinetic shots deal a mild amount of burn damage, along with spewing flames."
+ modifier = 10
+ cost = 25
+
+/obj/item/borg/upgrade/modkit/fire/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ ..()
+ playsound(K.firer, 'sound/magic/fireball.ogg', 20, 1)
+ var/list/hitlist = list()
+ for(var/turf/T in getline(KA.loc, target.loc) - get_turf(K.firer))
+ new /obj/effect/hotspot(T)
+ T.hotspot_expose(700,50,1)
+ for(var/mob/living/L in T.contents)
+ if(L in hitlist || (L == K.firer))
+ break
+ else
+ hitlist += L
+ L.adjustFireLoss(src.modifier)
+ to_chat(L, "You're hit by [KA]'s fire breath!")
+//king goat
+/obj/item/borg/upgrade/modkit/cooldown/cooler
+ name = "cooler modification kit"
+ desc = "Makes your kinetic accelerator shoot much faster, at the cost of 10 damage."
+ modifier = 5
+ cost = 35
+
+/obj/item/borg/upgrade/modkit/cooldown/cooler/modify_projectile(obj/item/projectile/kinetic/K)
+ K.damage -= (modifier *2)
+
+//rogue process
+/obj/item/borg/upgrade/modkit/plasma
+ name = "plasma modification kit"
+ desc = "Makes your accelerator also shoot a burst of plasma."
+ modifier = 10
+ cost = 35
+
+/obj/item/borg/upgrade/modkit/plasma/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
+ playsound(KA, 'sound/weapons/laser.ogg', 100, TRUE)
+ var/turf/startloc = K.loc
+ var/obj/item/projectile/P = new /obj/item/projectile/plasma/adv(startloc)
+ P.starting = startloc
+ P.firer = K.firer
+ P.fired_from = KA
+ P.yo = target.y - startloc.y
+ P.xo = target.x - startloc.x
+ P.original = target
+ P.preparePixelProjectile(target, src)
+ P.fire()
+
+//gladiator
+/obj/item/borg/upgrade/modkit/shielding
+ name = "shielding modification kit"
+ desc = "Makes your kinetic accelerator block 15% of all attacks while held."
+ modifier = 15
+ cost = 30
+
+/obj/item/borg/upgrade/modkit/shielding/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ KA.block_chance += modifier
+
+/obj/item/borg/upgrade/modkit/shielding/uninstall(obj/item/gun/energy/kinetic_accelerator/KA, forcemove)
+ . = ..()
+ KA.block_chance -= modifier
+
+//10mm modkit (currently broken, only the 10mm pka works)
+/obj/item/gun/energy/kinetic_accelerator/tenmm
+ desc = "A self recharging, ranged mining tool that does increased damage in low pressure. This one feels a bit heavier than usual."
+ ammo_type = list(/obj/item/ammo_casing/energy/kinetic/etenmm)
+
+/obj/item/borg/upgrade/modkit/tenmm
+ name = "10mm modification kit"
+ desc = "Makes your accelerator shoot 10mm bullets instead of kinetic shots."
+ cost = 50
+
+/obj/item/borg/upgrade/modkit/tenmm/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
+ ..()
+ KA.ammo_type[1] = /obj/item/ammo_casing/energy/kinetic/etenmm
+ var/obj/item/ammo_casing/energy/kinetic/etenmm/C = KA.ammo_type[1]
+ KA.chambered = C
+
+/obj/item/borg/upgrade/modkit/tenmm/uninstall(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
+ ..()
+ KA.ammo_type[1] = initial(KA.ammo_type[1])
+ var/obj/item/ammo_casing/energy/kinetic/C = KA.ammo_type[1]
+ KA.chambered = C
+
+/obj/item/ammo_casing/energy/kinetic/etenmm
+ projectile_type = /obj/item/projectile/kinetic/etenmm
+ select_name = "kinetic 10mm"
+ fire_sound = 'sound/weapons/gunshot.ogg'
+
+/obj/item/projectile/kinetic/etenmm
+ name = "kinetic 10mm"
+ damage = 30
+ damage_type = BRUTE
+ range = 50
+ color = "#FFFFFF"
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "bullet"
+
+/obj/item/projectile/kinetic/etenmm/prehit(atom/target)
+ if(kinetic_gun)
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_prehit(src, target, kinetic_gun)
+ return TRUE
+
+/obj/item/projectile/kinetic/etenmm/strike_thing(atom/target)
+ var/turf/target_turf = get_turf(target)
+ if(!target_turf)
+ target_turf = get_turf(src)
+ if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike_predamage(src, target_turf, target, kinetic_gun)
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike(src, target_turf, target, kinetic_gun)
+
+//sif
+/obj/item/borg/upgrade/modkit/critical
+ name = "critical modification kit"
+ desc = "Makes your kinetic accelerator have a 20% chance to critically wound your target."
+ modifier = 20
+ var/multiplier = 2
+ cost = 30
+
+/obj/item/borg/upgrade/modkit/critical/modify_projectile(obj/item/projectile/kinetic/K)
+ . = ..()
+ if(prob(modifier))
+ K.damage *= multiplier
+ K.name = "critical [K.name]"
diff --git a/sandcode/code/modules/ruins/lavalandruin_code/doom.dm b/sandcode/code/modules/ruins/lavalandruin_code/doom.dm
new file mode 100644
index 0000000000..8173b675e6
--- /dev/null
+++ b/sandcode/code/modules/ruins/lavalandruin_code/doom.dm
@@ -0,0 +1,119 @@
+/obj/item/stack/sheet/animalhide/goliath_hide/vest
+ name = "green armor vest"
+ desc = "100% armor pickup. Can be used to improve some types of armor."
+ icon = 'icons/obj/clothing/suits.dmi'
+ icon_state = "armoralt"
+ item_state = "armoralt"
+ color = "#00FF00"
+ light_power = 1
+ light_range = 2
+ light_color = "#00FF00"
+
+/obj/item/stack/sheet/animalhide/goliath_hide/vest/blue
+ name = "mega armor vest"
+ desc = "200% armor pickup. Can be used to improve some types of armor."
+ icon = 'icons/obj/clothing/suits.dmi'
+ icon_state = "armoralt"
+ item_state = "armoralt"
+ color = "#0000FF"
+ light_power = 2
+ light_range = 3
+ light_color = "#0000FF"
+
+/obj/item/reagent_containers/glass/beaker/synthflesh/healthvial
+ name = "health potion"
+ desc = "+1% health. Can be splashed to heal brute and burn damage."
+ color = "#0000FF"
+ light_power = 1
+ light_range = 2
+ light_color = "#0000FF"
+
+/obj/effect/mine/pickup/bloodbath/berserk
+ duration = 100
+ var/extraduration = 1100
+
+/obj/effect/mine/pickup/bloodbath/berserk/mineEffect(mob/living/carbon/victim)
+ if(!victim.client || !istype(victim))
+ return
+ to_chat(victim, "RIP AND TEAR")
+ var/old_color = victim.client.color
+ var/static/list/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0)
+ var/static/list/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0)
+
+ victim.log_message("entered a berserk frenzy", LOG_ATTACK)
+ victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,50)
+ to_chat(victim, "KILL, KILL, KILL!")
+ victim.client.color = pure_red
+ animate(victim.client,color = red_splash, time = 10, easing = SINE_EASING|EASE_OUT)
+ sleep(duration)
+ victim.client.color = old_color
+ sleep(extraduration)
+ victim.log_message("exited a berserk frenzy", LOG_ATTACK)
+ qdel(src)
+
+/turf/open/floor/carpet/blue/doomed
+ name = "marine base carpet"
+ desc = "Carpet, so barefoot demons can have some comfort."
+ floor_tile = null
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+
+/turf/closed/wall/mineral/plastitanium/doomed
+ name = "marine base wall"
+ desc = "A very doomed wall."
+ explosion_block = 50
+
+/obj/machinery/door/airlock/titanium/doomed
+ name = "marine base airlock"
+ desc = "Knee deep in the dead."
+
+/obj/machinery/door/airlock/titanium/doomed/locked
+ name = "jammed airlock"
+ desc = "It seems to be functional... there has to be a way to open it."
+ explosion_block = 50
+ var/list/candylist = list()
+ var/shouldunlock = FALSE
+
+/obj/machinery/door/airlock/titanium/doomed/locked/obj/machinery/door/airlock/titanium/doomed/locked/Initialize()
+ for(var/mob/living/simple_animal/hostile/asteroid/elite/candy/C in view(15))
+ candylist += C
+ if(candylist.len)
+ close()
+ sleep(5)
+ bolt()
+
+/obj/machinery/door/airlock/titanium/doomed/locked/obj/machinery/door/airlock/titanium/doomed/locked/process()
+ . = ..()
+ candylist = list()
+ for(var/mob/living/simple_animal/hostile/asteroid/elite/candy/C in view(15))
+ if(C.stat != DEAD)
+ candylist += C
+ return
+ if(!candylist.len)
+ STOP_PROCESSING(SSprocessing, src)
+ unbolt()
+
+/obj/item/gun/ballistic/shotgun/doomed
+ name = "classic pump-action shotgun"
+ desc = "Shotguns can deliver a heavy punch at close range and a generous pelting from a distance. Not nearly as powerful as it's super variant."
+ icon = 'sandcode/icons/obj/doom.dmi'
+ icon_state = "pumpshotgun"
+ w_class = WEIGHT_CLASS_NORMAL
+
+/obj/structure/fermenting_barrel/doom
+ name = "toxic waste barrel"
+ desc = "Filled with bad stuff. Probably explodes."
+ icon = 'sandcode/icons/obj/doom.dmi'
+ icon_state = "barrel"
+
+/obj/structure/fermenting_barrel/doom/Initialize()
+ ..()
+ src.reagents.add_reagent(pick(subtypesof(/datum/reagent/toxin)), 300)
+
+/obj/structure/fermenting_barrel/doom/Destroy()
+ . = ..()
+ explosion(src.loc, -1, -1, 1, -1, 0, 3)
+
+/area/ruin/powered/e1m1
+ name = "Hangar"
+ dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
+ icon_state = "dk_yellow"
diff --git a/sandcode/code/modules/ruins/lavalandruin_code/kinggoat.dm b/sandcode/code/modules/ruins/lavalandruin_code/kinggoat.dm
new file mode 100644
index 0000000000..535e96bc49
--- /dev/null
+++ b/sandcode/code/modules/ruins/lavalandruin_code/kinggoat.dm
@@ -0,0 +1,53 @@
+/turf/open/indestructible/gold
+ name = "gold floor"
+ baseturfs = /turf/open/indestructible/gold
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ icon_state = "gold"
+ tiled_dirt = FALSE
+ desc = "Very rich floor made out of pure gold! This floor seems indestructible for some reason..."
+
+/turf/open/indestructible/diamond
+ name = "diamond floor"
+ baseturfs = /turf/open/indestructible/diamond
+ initial_gas_mix = LAVALAND_DEFAULT_ATMOS
+ icon_state = "diamond"
+ tiled_dirt = FALSE
+ desc = "Very rich floor made out of pure diamond! This floor seems indestructible for some reason..."
+
+/obj/item/projectile/goat
+ name = "goat"
+ icon = 'icons/mob/animal.dmi'
+ icon_state = "goat"
+ damage = 5
+ damage_type = BRUTE
+ flag = "bullet"
+
+/obj/item/projectile/goat/on_hit(atom/target)
+ knockdown = 20
+ var/turf/location = get_turf(target)
+ new/mob/living/simple_animal/hostile/retaliate/goat(location)
+ playsound(location, 'sandcode/sound/items/goatsound.ogg', 40, TRUE)
+ qdel(src)
+
+/obj/item/ammo_casing/energy/goat
+ projectile_type = /obj/item/projectile/goat
+ select_name = "goat"
+
+/obj/item/gun/energy/goatgun
+ name = "goat gun"
+ desc = "Whoever you fire this at is gonna be in for a baaaaaaad surprise." //ha ha I am funny man please laugh HAHAHAHAHAHAHAHA
+ icon = 'sandcode/icons/obj/guns/goatgun.dmi'
+ icon_state = "goat_gun"
+ item_state = "c20r"
+ w_class = WEIGHT_CLASS_BULKY
+ ammo_type = list(/obj/item/ammo_casing/energy/goat)
+ cell_type = /obj/item/stock_parts/cell
+ clumsy_check = 0
+ selfcharge = 1
+
+/obj/structure/ladder/unbreakable/goat
+ name = "Ladder Out of King Goats Lair"
+ desc = "Apparantly the exit was inside him the whole time...gross."
+ resistance_flags = INDESTRUCTIBLE
+ id = "goatlayer"
+ height = 1
diff --git a/sandcode/code/modules/ruins/lavalandruin_code/misc.dm b/sandcode/code/modules/ruins/lavalandruin_code/misc.dm
new file mode 100644
index 0000000000..7c38cffeed
--- /dev/null
+++ b/sandcode/code/modules/ruins/lavalandruin_code/misc.dm
@@ -0,0 +1,91 @@
+/obj/item/katana/goldbrand
+ icon = 'sandcode/icons/obj/items_and_weapons.dmi'
+ icon_state = "goldbrand"
+ item_state = "goldbrand"
+ lefthand_file = 'sandcode/icons/mob/inhands/weapons/swords_lefthand.dmi'
+ righthand_file = 'sandcode/icons/mob/inhands/weapons/swords_righthand.dmi'
+ name = "Goldbrand"
+ desc = "Granted only to those who prove themselves in battle, this sword cuts and burns flesh."
+ force = 18
+ armour_penetration = 15
+ block_chance = 35 //not too bad really
+ var/burn_force = 5
+ var/firestacking = 10
+ light_color = "#FFFF99"
+ light_range = 2
+ light_power = 1
+ var/list/ourmegafauna = list()
+ var/upgradedname = "Eltonbrand"
+ var/upgradeddesc = "Go to Hell, Carolina!"
+ w_class = WEIGHT_CLASS_BULKY
+
+/obj/item/katana/goldbrand/Initialize()
+ ..()
+ START_PROCESSING(SSobj,src)
+
+/obj/item/katana/goldbrand/process()
+ ourmegafauna = list()
+ for(var/mob/living/simple_animal/hostile/megafauna/M in GLOB.mob_living_list)
+ ourmegafauna += M
+ if(!ourmegafauna.len)
+ visible_message("[src] shines brightly, turning into [upgradedname]!")
+ name = upgradedname
+ desc = upgradeddesc
+ block_chance = 66
+ armour_penetration = 35
+ force = 20
+ burn_force = 20
+ firestacking = 20
+ light_range = 3
+ light_power = 2
+ w_class = WEIGHT_CLASS_NORMAL
+ STOP_PROCESSING(SSobj,src)
+
+/obj/item/katana/goldbrand/afterattack(target, user)
+ ..()
+ if(iscarbon(target))
+ var/mob/living/carbon/L = target
+ var/mob/living/carbon/ourman = user
+ L.apply_damage(damage = burn_force,damagetype = BURN, def_zone = L.get_bodypart(check_zone(ourman.zone_selected)), blocked = FALSE, forced = FALSE)
+ L.adjust_fire_stacks(firestacking)
+ L.IgniteMob()
+ else if(isliving(target))
+ var/mob/living/thetarget = target
+ thetarget.adjustBruteLoss(burn_force)
+
+/obj/effect/wrath
+ name = "Wrath's Wall"
+ desc = "Only those who truly revel in destruction can pass."
+ anchored = TRUE
+ density = TRUE
+ icon_state = "shield-cult"
+ icon = 'icons/effects/cult_effects.dmi'
+ color = "#FF0000"
+ var/list/megalist = list()
+ var/list/cmegalist = list()
+
+/obj/effect/wrath/Initialize()
+ ..()
+ megalist = list("Cockblock", "Cockblock", "Cockblock") //cockblock just to be sure that no one goes through the wrath wall in the 10 minute grace period
+ addtimer(CALLBACK(src, .proc/updatemegalist), 6000) //10 minutes delay so that all megafauna can spawn and etc.
+
+/obj/effect/wrath/proc/updatemegalist()
+ megalist = list()
+ for(var/mob/living/simple_animal/hostile/megafauna/M in GLOB.mob_living_list)
+ megalist += M.name
+
+/obj/effect/wrath/CanPass(atom/movable/mover, turf/target)
+ cmegalist = list() //clears the list to not cause problems.
+ for(var/mob/living/simple_animal/hostile/megafauna/M in GLOB.mob_living_list)
+ cmegalist += M
+ if(ishuman(mover))
+ var/mob/living/carbon/human/H = mover
+ if(cmegalist.len <= megalist.len - 2)
+ H.visible_message("[H] pushes through [src]!", "You deserve your reward. Reap your hunt.")
+ return TRUE
+ else
+ to_chat(H, "Just touching the door burns your hand... You're not ready.")
+ H.apply_damage(damage = 5,damagetype = BURN, def_zone = H.get_bodypart(BODY_ZONE_R_ARM), blocked = FALSE, forced = FALSE)
+
+/area/ruin/powered/wrath
+ icon_state = "dk_yellow"
diff --git a/sandcode/code/modules/uplink/uplink_roles.dm b/sandcode/code/modules/uplink/uplink_roles.dm
new file mode 100644
index 0000000000..3a90e7139e
--- /dev/null
+++ b/sandcode/code/modules/uplink/uplink_roles.dm
@@ -0,0 +1,24 @@
+//miner exclusives
+/datum/uplink_item/role_restricted/crusher
+ name = "Harmful Crusher"
+ desc = "A kinetic crusher with the ability to harm complex and small lifeforms. Looks like a normal crusher from a distance."
+ item = /obj/item/kinetic_crusher/harm
+ cost = 15
+ limited_stock = 1
+ restricted_roles = list("Shaft Miner", "Quartermaster")
+
+/datum/uplink_item/role_restricted/pka_tenmm
+ name = "10mm Proto-Kinetic Accelerator"
+ desc = "An accelerator loaded in 10mm bullets. Accepts normal PKA mods and suffers no pressure penalty, and looks like a normal accelerator from a distance."
+ item = /obj/item/gun/energy/kinetic_accelerator/tenmm
+ cost = 15
+ limited_stock = 1
+ restricted_roles = list("Shaft Miner", "Quartermaster")
+
+/datum/uplink_item/role_restricted/pka_nopenalty
+ name = "On-station Proto-Kinetic Accelerator"
+ desc = "An accelerator that receives no penalties from pressure increases."
+ item = /obj/item/gun/energy/kinetic_accelerator/nopenalty
+ cost = 15
+ limited_stock = 1
+ restricted_roles = list("Shaft Miner", "Quartermaster")
diff --git a/sandcode/icons/effects/beam.dmi b/sandcode/icons/effects/beam.dmi
new file mode 100644
index 0000000000..d4767fe5ee
Binary files /dev/null and b/sandcode/icons/effects/beam.dmi differ
diff --git a/sandcode/icons/mob/actions/actions_elites.dmi b/sandcode/icons/mob/actions/actions_elites.dmi
new file mode 100644
index 0000000000..14176334b0
Binary files /dev/null and b/sandcode/icons/mob/actions/actions_elites.dmi differ
diff --git a/sandcode/icons/mob/clothing/head.dmi b/sandcode/icons/mob/clothing/head.dmi
index 75e48a9407..5e7539eae8 100644
Binary files a/sandcode/icons/mob/clothing/head.dmi and b/sandcode/icons/mob/clothing/head.dmi differ
diff --git a/sandcode/icons/mob/clothing/head_muzzled.dmi b/sandcode/icons/mob/clothing/head_muzzled.dmi
index 7052a8c342..7cf390295c 100644
Binary files a/sandcode/icons/mob/clothing/head_muzzled.dmi and b/sandcode/icons/mob/clothing/head_muzzled.dmi differ
diff --git a/sandcode/icons/mob/clothing/mask.dmi b/sandcode/icons/mob/clothing/mask.dmi
index 45a2376fc8..def1b2cc20 100644
Binary files a/sandcode/icons/mob/clothing/mask.dmi and b/sandcode/icons/mob/clothing/mask.dmi differ
diff --git a/sandcode/icons/mob/clothing/neck.dmi b/sandcode/icons/mob/clothing/neck.dmi
new file mode 100644
index 0000000000..d27671a717
Binary files /dev/null and b/sandcode/icons/mob/clothing/neck.dmi differ
diff --git a/sandcode/icons/mob/clothing/suit.dmi b/sandcode/icons/mob/clothing/suit.dmi
index 0dd5e31ef1..f3b450e7f6 100644
Binary files a/sandcode/icons/mob/clothing/suit.dmi and b/sandcode/icons/mob/clothing/suit.dmi differ
diff --git a/sandcode/icons/mob/clothing/suit_digi.dmi b/sandcode/icons/mob/clothing/suit_digi.dmi
index 8e9f2fb065..089aa776a8 100644
Binary files a/sandcode/icons/mob/clothing/suit_digi.dmi and b/sandcode/icons/mob/clothing/suit_digi.dmi differ
diff --git a/sandcode/icons/mob/inhands/equipment/mining_lefthand.dmi b/sandcode/icons/mob/inhands/equipment/mining_lefthand.dmi
new file mode 100644
index 0000000000..5dc2b5071d
Binary files /dev/null and b/sandcode/icons/mob/inhands/equipment/mining_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/equipment/mining_righthand.dmi b/sandcode/icons/mob/inhands/equipment/mining_righthand.dmi
new file mode 100644
index 0000000000..34e1e70f04
Binary files /dev/null and b/sandcode/icons/mob/inhands/equipment/mining_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/equipment/shields_lefthand.dmi b/sandcode/icons/mob/inhands/equipment/shields_lefthand.dmi
new file mode 100644
index 0000000000..fbe3ab07dc
Binary files /dev/null and b/sandcode/icons/mob/inhands/equipment/shields_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/equipment/shields_righthand.dmi b/sandcode/icons/mob/inhands/equipment/shields_righthand.dmi
new file mode 100644
index 0000000000..f27b0ca712
Binary files /dev/null and b/sandcode/icons/mob/inhands/equipment/shields_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/item_lefthand.dmi b/sandcode/icons/mob/inhands/item_lefthand.dmi
new file mode 100644
index 0000000000..673007c64a
Binary files /dev/null and b/sandcode/icons/mob/inhands/item_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/item_righthand.dmi b/sandcode/icons/mob/inhands/item_righthand.dmi
new file mode 100644
index 0000000000..21355cb1d7
Binary files /dev/null and b/sandcode/icons/mob/inhands/item_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/axes_lefthand.dmi b/sandcode/icons/mob/inhands/weapons/axes_lefthand.dmi
new file mode 100644
index 0000000000..085ca086a4
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/axes_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/axes_righthand.dmi b/sandcode/icons/mob/inhands/weapons/axes_righthand.dmi
new file mode 100644
index 0000000000..4b22dba66d
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/axes_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/crucible_lefthand.dmi b/sandcode/icons/mob/inhands/weapons/crucible_lefthand.dmi
new file mode 100644
index 0000000000..896f812d7c
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/crucible_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/crucible_righthand.dmi b/sandcode/icons/mob/inhands/weapons/crucible_righthand.dmi
new file mode 100644
index 0000000000..05e238c84a
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/crucible_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/guns_lefthand.dmi b/sandcode/icons/mob/inhands/weapons/guns_lefthand.dmi
new file mode 100644
index 0000000000..8871ec5afd
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/guns_righthand.dmi b/sandcode/icons/mob/inhands/weapons/guns_righthand.dmi
new file mode 100644
index 0000000000..a07597f370
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/guns_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/hammerspc_lefthand.dmi b/sandcode/icons/mob/inhands/weapons/hammerspc_lefthand.dmi
new file mode 100644
index 0000000000..beff0eaaf1
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/hammerspc_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/hammerspc_righthand.dmi b/sandcode/icons/mob/inhands/weapons/hammerspc_righthand.dmi
new file mode 100644
index 0000000000..daba9fd8ef
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/hammerspc_righthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/swords_lefthand.dmi b/sandcode/icons/mob/inhands/weapons/swords_lefthand.dmi
new file mode 100644
index 0000000000..5bbcad8554
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/swords_lefthand.dmi differ
diff --git a/sandcode/icons/mob/inhands/weapons/swords_righthand.dmi b/sandcode/icons/mob/inhands/weapons/swords_righthand.dmi
new file mode 100644
index 0000000000..9e0368f114
Binary files /dev/null and b/sandcode/icons/mob/inhands/weapons/swords_righthand.dmi differ
diff --git a/sandcode/icons/mob/king_of_goats.dmi b/sandcode/icons/mob/king_of_goats.dmi
new file mode 100644
index 0000000000..95997b0d7d
Binary files /dev/null and b/sandcode/icons/mob/king_of_goats.dmi differ
diff --git a/sandcode/icons/mob/large-worn-icons/32x64/head.dmi b/sandcode/icons/mob/large-worn-icons/32x64/head.dmi
new file mode 100644
index 0000000000..b09b411bde
Binary files /dev/null and b/sandcode/icons/mob/large-worn-icons/32x64/head.dmi differ
diff --git a/sandcode/icons/mob/large-worn-icons/64x64/head.dmi b/sandcode/icons/mob/large-worn-icons/64x64/head.dmi
new file mode 100644
index 0000000000..005bc25956
Binary files /dev/null and b/sandcode/icons/mob/large-worn-icons/64x64/head.dmi differ
diff --git a/sandcode/icons/mob/lavaland/64x64megafauna.dmi b/sandcode/icons/mob/lavaland/64x64megafauna.dmi
new file mode 100644
index 0000000000..dded6c56da
Binary files /dev/null and b/sandcode/icons/mob/lavaland/64x64megafauna.dmi differ
diff --git a/sandcode/icons/mob/lavaland/96x96megafauna.dmi b/sandcode/icons/mob/lavaland/96x96megafauna.dmi
new file mode 100644
index 0000000000..f80f530ae9
Binary files /dev/null and b/sandcode/icons/mob/lavaland/96x96megafauna.dmi differ
diff --git a/sandcode/icons/mob/lavaland/drake_greyscale.dmi b/sandcode/icons/mob/lavaland/drake_greyscale.dmi
new file mode 100644
index 0000000000..68deaa3cf6
Binary files /dev/null and b/sandcode/icons/mob/lavaland/drake_greyscale.dmi differ
diff --git a/sandcode/icons/mob/lavaland/drakeling_greyscale.dmi b/sandcode/icons/mob/lavaland/drakeling_greyscale.dmi
new file mode 100644
index 0000000000..2d24e1f489
Binary files /dev/null and b/sandcode/icons/mob/lavaland/drakeling_greyscale.dmi differ
diff --git a/sandcode/icons/mob/lavaland/glaurung.dmi b/sandcode/icons/mob/lavaland/glaurung.dmi
new file mode 100644
index 0000000000..5f7bbc0d38
Binary files /dev/null and b/sandcode/icons/mob/lavaland/glaurung.dmi differ
diff --git a/sandcode/icons/mob/lavaland/lavaland_elites.dmi b/sandcode/icons/mob/lavaland/lavaland_elites.dmi
new file mode 100644
index 0000000000..f80d4067fe
Binary files /dev/null and b/sandcode/icons/mob/lavaland/lavaland_elites.dmi differ
diff --git a/sandcode/icons/mob/lavaland/lavaland_monsters.dmi b/sandcode/icons/mob/lavaland/lavaland_monsters.dmi
new file mode 100644
index 0000000000..621716df8b
Binary files /dev/null and b/sandcode/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/sandcode/icons/mob/lavaland/rogue.dmi b/sandcode/icons/mob/lavaland/rogue.dmi
new file mode 100644
index 0000000000..d4891b5820
Binary files /dev/null and b/sandcode/icons/mob/lavaland/rogue.dmi differ
diff --git a/sandcode/icons/mob/lavaland/sif.dmi b/sandcode/icons/mob/lavaland/sif.dmi
new file mode 100644
index 0000000000..290b15cac6
Binary files /dev/null and b/sandcode/icons/mob/lavaland/sif.dmi differ
diff --git a/sandcode/icons/mob/lavaland/sif_sword.dmi b/sandcode/icons/mob/lavaland/sif_sword.dmi
new file mode 100644
index 0000000000..2ef93aff73
Binary files /dev/null and b/sandcode/icons/mob/lavaland/sif_sword.dmi differ
diff --git a/sandcode/icons/mob/screen_alert.dmi b/sandcode/icons/mob/screen_alert.dmi
new file mode 100644
index 0000000000..92a56c6324
Binary files /dev/null and b/sandcode/icons/mob/screen_alert.dmi differ
diff --git a/sandcode/icons/obj/1x2.dmi b/sandcode/icons/obj/1x2.dmi
new file mode 100644
index 0000000000..34162e88b6
Binary files /dev/null and b/sandcode/icons/obj/1x2.dmi differ
diff --git a/sandcode/icons/obj/clothing/hats.dmi b/sandcode/icons/obj/clothing/hats.dmi
index ed921f2f13..1a5b17aaf2 100644
Binary files a/sandcode/icons/obj/clothing/hats.dmi and b/sandcode/icons/obj/clothing/hats.dmi differ
diff --git a/sandcode/icons/obj/clothing/head.dmi b/sandcode/icons/obj/clothing/head.dmi
new file mode 100644
index 0000000000..5cf7665832
Binary files /dev/null and b/sandcode/icons/obj/clothing/head.dmi differ
diff --git a/sandcode/icons/obj/clothing/head_muzzled.dmi b/sandcode/icons/obj/clothing/head_muzzled.dmi
new file mode 100644
index 0000000000..07c078c353
Binary files /dev/null and b/sandcode/icons/obj/clothing/head_muzzled.dmi differ
diff --git a/sandcode/icons/obj/clothing/mask.dmi b/sandcode/icons/obj/clothing/mask.dmi
index fafb08fda5..391e5674a5 100644
Binary files a/sandcode/icons/obj/clothing/mask.dmi and b/sandcode/icons/obj/clothing/mask.dmi differ
diff --git a/sandcode/icons/obj/clothing/mask_muzzled.dmi b/sandcode/icons/obj/clothing/mask_muzzled.dmi
new file mode 100644
index 0000000000..882742d063
Binary files /dev/null and b/sandcode/icons/obj/clothing/mask_muzzled.dmi differ
diff --git a/sandcode/icons/obj/clothing/masks.dmi b/sandcode/icons/obj/clothing/masks.dmi
new file mode 100644
index 0000000000..2709f5bd80
Binary files /dev/null and b/sandcode/icons/obj/clothing/masks.dmi differ
diff --git a/sandcode/icons/obj/clothing/neck.dmi b/sandcode/icons/obj/clothing/neck.dmi
new file mode 100644
index 0000000000..0a200dda55
Binary files /dev/null and b/sandcode/icons/obj/clothing/neck.dmi differ
diff --git a/sandcode/icons/obj/clothing/suit_digi.dmi b/sandcode/icons/obj/clothing/suit_digi.dmi
new file mode 100644
index 0000000000..70920203a5
Binary files /dev/null and b/sandcode/icons/obj/clothing/suit_digi.dmi differ
diff --git a/sandcode/icons/obj/clothing/suits.dmi b/sandcode/icons/obj/clothing/suits.dmi
index b3f6db3e4a..8df4fcef81 100644
Binary files a/sandcode/icons/obj/clothing/suits.dmi and b/sandcode/icons/obj/clothing/suits.dmi differ
diff --git a/sandcode/icons/obj/doom.dmi b/sandcode/icons/obj/doom.dmi
new file mode 100644
index 0000000000..c69eb819ca
Binary files /dev/null and b/sandcode/icons/obj/doom.dmi differ
diff --git a/sandcode/icons/obj/guns/energy.dmi b/sandcode/icons/obj/guns/energy.dmi
new file mode 100644
index 0000000000..9aed6463ef
Binary files /dev/null and b/sandcode/icons/obj/guns/energy.dmi differ
diff --git a/sandcode/icons/obj/guns/goatgun.dmi b/sandcode/icons/obj/guns/goatgun.dmi
new file mode 100644
index 0000000000..6072cdd1ba
Binary files /dev/null and b/sandcode/icons/obj/guns/goatgun.dmi differ
diff --git a/sandcode/icons/obj/guns/projectile.dmi b/sandcode/icons/obj/guns/projectile.dmi
index e72a73c56b..31b35e7ce4 100644
Binary files a/sandcode/icons/obj/guns/projectile.dmi and b/sandcode/icons/obj/guns/projectile.dmi differ
diff --git a/sandcode/icons/obj/items_and_weapons.dmi b/sandcode/icons/obj/items_and_weapons.dmi
new file mode 100644
index 0000000000..70dfb0db88
Binary files /dev/null and b/sandcode/icons/obj/items_and_weapons.dmi differ
diff --git a/sandcode/icons/obj/lavaland/artefacts.dmi b/sandcode/icons/obj/lavaland/artefacts.dmi
new file mode 100644
index 0000000000..6466522fd5
Binary files /dev/null and b/sandcode/icons/obj/lavaland/artefacts.dmi differ
diff --git a/sandcode/icons/obj/lavaland/sif.dmi b/sandcode/icons/obj/lavaland/sif.dmi
new file mode 100644
index 0000000000..6f9ffdc89f
Binary files /dev/null and b/sandcode/icons/obj/lavaland/sif.dmi differ
diff --git a/sandcode/icons/obj/mining.dmi b/sandcode/icons/obj/mining.dmi
new file mode 100644
index 0000000000..9156285da0
Binary files /dev/null and b/sandcode/icons/obj/mining.dmi differ
diff --git a/sandcode/icons/obj/plushes.dmi b/sandcode/icons/obj/plushes.dmi
new file mode 100644
index 0000000000..ef4779bf39
Binary files /dev/null and b/sandcode/icons/obj/plushes.dmi differ
diff --git a/sandcode/icons/obj/plushies.dmi b/sandcode/icons/obj/plushies.dmi
new file mode 100644
index 0000000000..19e029c9b0
Binary files /dev/null and b/sandcode/icons/obj/plushies.dmi differ
diff --git a/sandcode/icons/obj/shields.dmi b/sandcode/icons/obj/shields.dmi
new file mode 100644
index 0000000000..3405e0b008
Binary files /dev/null and b/sandcode/icons/obj/shields.dmi differ
diff --git a/sandcode/sound/ambience/Visager-Battle.ogg b/sandcode/sound/ambience/Visager-Battle.ogg
new file mode 100644
index 0000000000..addce3c309
Binary files /dev/null and b/sandcode/sound/ambience/Visager-Battle.ogg differ
diff --git a/sandcode/sound/ambience/Visager-Miniboss_Fight.ogg b/sandcode/sound/ambience/Visager-Miniboss_Fight.ogg
new file mode 100644
index 0000000000..c2eeca0a11
Binary files /dev/null and b/sandcode/sound/ambience/Visager-Miniboss_Fight.ogg differ
diff --git a/sandcode/sound/ambience/bfgdivision.ogg b/sandcode/sound/ambience/bfgdivision.ogg
new file mode 100644
index 0000000000..88dc8e604e
Binary files /dev/null and b/sandcode/sound/ambience/bfgdivision.ogg differ
diff --git a/sandcode/sound/ambience/dragonborn.ogg b/sandcode/sound/ambience/dragonborn.ogg
new file mode 100644
index 0000000000..f9bf25aa67
Binary files /dev/null and b/sandcode/sound/ambience/dragonborn.ogg differ
diff --git a/sandcode/sound/ambience/dummyremix.ogg b/sandcode/sound/ambience/dummyremix.ogg
new file mode 100644
index 0000000000..ee39b39126
Binary files /dev/null and b/sandcode/sound/ambience/dummyremix.ogg differ
diff --git a/sandcode/sound/ambience/duskcreations.ogg b/sandcode/sound/ambience/duskcreations.ogg
new file mode 100644
index 0000000000..fc0b6a9d6f
Binary files /dev/null and b/sandcode/sound/ambience/duskcreations.ogg differ
diff --git a/sandcode/sound/ambience/furidanger802.ogg b/sandcode/sound/ambience/furidanger802.ogg
new file mode 100644
index 0000000000..14e6f3b639
Binary files /dev/null and b/sandcode/sound/ambience/furidanger802.ogg differ
diff --git a/sandcode/sound/ambience/gladiator.ogg b/sandcode/sound/ambience/gladiator.ogg
new file mode 100644
index 0000000000..7d15031ecb
Binary files /dev/null and b/sandcode/sound/ambience/gladiator.ogg differ
diff --git a/sandcode/sound/ambience/igneon-system-and-death-machine-sins.ogg b/sandcode/sound/ambience/igneon-system-and-death-machine-sins.ogg
new file mode 100644
index 0000000000..acd290aea9
Binary files /dev/null and b/sandcode/sound/ambience/igneon-system-and-death-machine-sins.ogg differ
diff --git a/sandcode/sound/ambience/lisapebbleman.ogg b/sandcode/sound/ambience/lisapebbleman.ogg
new file mode 100644
index 0000000000..ba5057ad3a
Binary files /dev/null and b/sandcode/sound/ambience/lisapebbleman.ogg differ
diff --git a/sandcode/sound/ambience/machinegirl_excruciatingdeath.ogg b/sandcode/sound/ambience/machinegirl_excruciatingdeath.ogg
new file mode 100644
index 0000000000..1d6c7017c3
Binary files /dev/null and b/sandcode/sound/ambience/machinegirl_excruciatingdeath.ogg differ
diff --git a/sandcode/sound/ambience/mastermind.ogg b/sandcode/sound/ambience/mastermind.ogg
new file mode 100644
index 0000000000..cc732f9bc1
Binary files /dev/null and b/sandcode/sound/ambience/mastermind.ogg differ
diff --git a/sandcode/sound/ambience/mbrsystemshock.ogg b/sandcode/sound/ambience/mbrsystemshock.ogg
new file mode 100644
index 0000000000..d6923097f4
Binary files /dev/null and b/sandcode/sound/ambience/mbrsystemshock.ogg differ
diff --git a/sandcode/sound/ambience/megalovania.ogg b/sandcode/sound/ambience/megalovania.ogg
new file mode 100644
index 0000000000..56f49c8b3e
Binary files /dev/null and b/sandcode/sound/ambience/megalovania.ogg differ
diff --git a/sandcode/sound/ambience/oblivion.ogg b/sandcode/sound/ambience/oblivion.ogg
new file mode 100644
index 0000000000..51862fb677
Binary files /dev/null and b/sandcode/sound/ambience/oblivion.ogg differ
diff --git a/sandcode/sound/ambience/rollermobster.ogg b/sandcode/sound/ambience/rollermobster.ogg
new file mode 100644
index 0000000000..3096d1adb6
Binary files /dev/null and b/sandcode/sound/ambience/rollermobster.ogg differ
diff --git a/sandcode/sound/ambience/terrariaboss1.ogg b/sandcode/sound/ambience/terrariaboss1.ogg
new file mode 100644
index 0000000000..8970afa844
Binary files /dev/null and b/sandcode/sound/ambience/terrariaboss1.ogg differ
diff --git a/sandcode/sound/ambience/theonlythingtheyfearisyou.ogg b/sandcode/sound/ambience/theonlythingtheyfearisyou.ogg
new file mode 100644
index 0000000000..3cf3674388
Binary files /dev/null and b/sandcode/sound/ambience/theonlythingtheyfearisyou.ogg differ
diff --git a/sandcode/sound/ambience/theopenedway.ogg b/sandcode/sound/ambience/theopenedway.ogg
new file mode 100644
index 0000000000..ada6688947
Binary files /dev/null and b/sandcode/sound/ambience/theopenedway.ogg differ
diff --git a/sandcode/sound/effects/gladiatordeathsound.ogg b/sandcode/sound/effects/gladiatordeathsound.ogg
new file mode 100644
index 0000000000..d148e3540a
Binary files /dev/null and b/sandcode/sound/effects/gladiatordeathsound.ogg differ
diff --git a/sandcode/sound/items/goatsound.ogg b/sandcode/sound/items/goatsound.ogg
new file mode 100644
index 0000000000..a2fb2ee9cd
Binary files /dev/null and b/sandcode/sound/items/goatsound.ogg differ
diff --git a/sandcode/sound/misc/doomdies.wav b/sandcode/sound/misc/doomdies.wav
new file mode 100644
index 0000000000..44dc28ba37
Binary files /dev/null and b/sandcode/sound/misc/doomdies.wav differ
diff --git a/sandcode/sound/misc/doominjured.wav b/sandcode/sound/misc/doominjured.wav
new file mode 100644
index 0000000000..1cc93dbfe0
Binary files /dev/null and b/sandcode/sound/misc/doominjured.wav differ
diff --git a/sandcode/sound/misc/doomscream.wav b/sandcode/sound/misc/doomscream.wav
new file mode 100644
index 0000000000..bd37b3a1e2
Binary files /dev/null and b/sandcode/sound/misc/doomscream.wav differ
diff --git a/sandcode/sound/misc/doomscream2.wav b/sandcode/sound/misc/doomscream2.wav
new file mode 100644
index 0000000000..44dc28ba37
Binary files /dev/null and b/sandcode/sound/misc/doomscream2.wav differ
diff --git a/sandcode/sound/misc/gorenest.ogg b/sandcode/sound/misc/gorenest.ogg
new file mode 100644
index 0000000000..f41fa4081e
Binary files /dev/null and b/sandcode/sound/misc/gorenest.ogg differ
diff --git a/sandcode/sound/misc/impattacks.wav b/sandcode/sound/misc/impattacks.wav
new file mode 100644
index 0000000000..866c45463d
Binary files /dev/null and b/sandcode/sound/misc/impattacks.wav differ
diff --git a/sandcode/sound/misc/impdies.wav b/sandcode/sound/misc/impdies.wav
new file mode 100644
index 0000000000..43a2e288bd
Binary files /dev/null and b/sandcode/sound/misc/impdies.wav differ
diff --git a/sandcode/sound/misc/impinjured.wav b/sandcode/sound/misc/impinjured.wav
new file mode 100644
index 0000000000..baa6e89305
Binary files /dev/null and b/sandcode/sound/misc/impinjured.wav differ
diff --git a/sandcode/sound/misc/impnearby.wav b/sandcode/sound/misc/impnearby.wav
new file mode 100644
index 0000000000..da87a6b4e6
Binary files /dev/null and b/sandcode/sound/misc/impnearby.wav differ
diff --git a/sandcode/sound/misc/impranged.wav b/sandcode/sound/misc/impranged.wav
new file mode 100644
index 0000000000..5d9f84c256
Binary files /dev/null and b/sandcode/sound/misc/impranged.wav differ
diff --git a/sandcode/sound/misc/impsight.wav b/sandcode/sound/misc/impsight.wav
new file mode 100644
index 0000000000..b3f50c386a
Binary files /dev/null and b/sandcode/sound/misc/impsight.wav differ
diff --git a/sandcode/sound/misc/impsight2.wav b/sandcode/sound/misc/impsight2.wav
new file mode 100644
index 0000000000..61c5bef686
Binary files /dev/null and b/sandcode/sound/misc/impsight2.wav differ
diff --git a/sandcode/sound/sif/blade_spin.ogg b/sandcode/sound/sif/blade_spin.ogg
new file mode 100644
index 0000000000..f80a0d9bf2
Binary files /dev/null and b/sandcode/sound/sif/blade_spin.ogg differ
diff --git a/sandcode/sound/sif/death_howl.ogg b/sandcode/sound/sif/death_howl.ogg
new file mode 100644
index 0000000000..0d69387331
Binary files /dev/null and b/sandcode/sound/sif/death_howl.ogg differ
diff --git a/sandcode/sound/sif/howl.ogg b/sandcode/sound/sif/howl.ogg
new file mode 100644
index 0000000000..d73c0aab39
Binary files /dev/null and b/sandcode/sound/sif/howl.ogg differ
diff --git a/sandcode/sound/sif/sif_slash.ogg b/sandcode/sound/sif/sif_slash.ogg
new file mode 100644
index 0000000000..9db710e588
Binary files /dev/null and b/sandcode/sound/sif/sif_slash.ogg differ
diff --git a/sandcode/sound/sif/sif_stomp.ogg b/sandcode/sound/sif/sif_stomp.ogg
new file mode 100644
index 0000000000..7223d497aa
Binary files /dev/null and b/sandcode/sound/sif/sif_stomp.ogg differ
diff --git a/sandcode/sound/sif/whoosh1.ogg b/sandcode/sound/sif/whoosh1.ogg
new file mode 100644
index 0000000000..dd48eff9da
Binary files /dev/null and b/sandcode/sound/sif/whoosh1.ogg differ
diff --git a/sandcode/sound/sif/whoosh2.ogg b/sandcode/sound/sif/whoosh2.ogg
new file mode 100644
index 0000000000..5f89b3e91a
Binary files /dev/null and b/sandcode/sound/sif/whoosh2.ogg differ
diff --git a/sandcode/sound/sif/whoosh3.ogg b/sandcode/sound/sif/whoosh3.ogg
new file mode 100644
index 0000000000..cfe9833855
Binary files /dev/null and b/sandcode/sound/sif/whoosh3.ogg differ
diff --git a/sandcode/sound/weapons/zweihanderslice.ogg b/sandcode/sound/weapons/zweihanderslice.ogg
new file mode 100644
index 0000000000..aca92097be
Binary files /dev/null and b/sandcode/sound/weapons/zweihanderslice.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index c19023c018..52610f0a69 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -17,6 +17,7 @@
#include "_maps\_basemap.dm"
#include "code\_compile_options.dm"
#include "code\world.dm"
+#include "code\__DEFINES\__512_compatibility_sandstorm.dm"
#include "code\__DEFINES\_globals.dm"
#include "code\__DEFINES\_protect.dm"
#include "code\__DEFINES\_tick.dm"
@@ -3511,13 +3512,19 @@
#include "modular_citadel\code\modules\reagents\objects\items.dm"
#include "sandcode\code\__DEFINES\language.dm"
#include "sandcode\code\__DEFINES\runechat_defines.dm"
+#include "sandcode\code\__DEFINES\status_effects.dm"
#include "sandcode\code\__DEFINES\traits.dm"
#include "sandcode\code\_onclick\hud\screen_objects.dm"
+#include "sandcode\code\datums\action.dm"
#include "sandcode\code\datums\shuttles.dm"
+#include "sandcode\code\datums\ruins\lavaland.dm"
+#include "sandcode\code\datums\status_effects\buffs.dm"
+#include "sandcode\code\datums\status_effects\debuffs.dm"
#include "sandcode\code\datums\traits\_quirk.dm"
#include "sandcode\code\datums\traits\negative.dm"
#include "sandcode\code\datums\traits\neutral.dm"
#include "sandcode\code\game\area\ship_area.dm"
+#include "sandcode\code\game\area\areas\ruins\lavaland.dm"
#include "sandcode\code\game\machinery\autodoc.dm"
#include "sandcode\code\game\machinery\cryopod.dm"
#include "sandcode\code\game\machinery\cryptominers.dm"
@@ -3537,9 +3544,13 @@
#include "sandcode\code\game\objects\items\circuitboards\machine_circuitboards.dm"
#include "sandcode\code\game\objects\items\devices\extra_arm.dm"
#include "sandcode\code\game\objects\items\devices\floor_painter.dm"
+#include "sandcode\code\game\objects\items\plushes\plushes.dm"
#include "sandcode\code\game\objects\items\robot\robot_upgrades.dm"
#include "sandcode\code\game\objects\items\storage\backpack.dm"
#include "sandcode\code\game\objects\items\storage\bags.dm"
+#include "sandcode\code\game\objects\structures\ladders.dm"
+#include "sandcode\code\game\objects\structures\lavaland\necropolis_tendril.dm"
+#include "sandcode\code\game\turfs\simulated\floor\asteroid.dm"
#include "sandcode\code\interactions\_interaction.dm"
#include "sandcode\code\interactions\interaction_definitions.dm"
#include "sandcode\code\interactions\interaction_interface.dm"
@@ -3555,6 +3566,7 @@
#include "sandcode\code\modules\cargo\packs\emergency.dm"
#include "sandcode\code\modules\client\asset_cache.dm"
#include "sandcode\code\modules\clothing\refactor.dm"
+#include "sandcode\code\modules\clothing\head\misc.dm"
#include "sandcode\code\modules\clothing\masks\miscellaneous.dm"
#include "sandcode\code\modules\clothing\outfits\standard.dm"
#include "sandcode\code\modules\clothing\spacesuits\chronosuit.dm"
@@ -3562,8 +3574,12 @@
#include "sandcode\code\modules\crafting\recipes\recipes_misc.dm"
#include "sandcode\code\modules\hydroponics\grown\misc.dm"
#include "sandcode\code\modules\integrated_electronics\subtypes\output.dm"
+#include "sandcode\code\modules\language\dragon.dm"
#include "sandcode\code\modules\language\language.dm"
#include "sandcode\code\modules\mining\machine_bluespaceminer.dm"
+#include "sandcode\code\modules\mining\equipment\kinetic_crusher.dm"
+#include "sandcode\code\modules\mining\equipment\regenerative_core.dm"
+#include "sandcode\code\modules\mining\lavaland\necropolis_chests.dm"
#include "sandcode\code\modules\misc\misc.dm"
#include "sandcode\code\modules\mob\emote.dm"
#include "sandcode\code\modules\mob\say.dm"
@@ -3575,11 +3591,41 @@
#include "sandcode\code\modules\mob\living\ssd_indicator.dm"
#include "sandcode\code\modules\mob\living\typing_indicator_overrides.dm"
#include "sandcode\code\modules\mob\living\simple_animal\friendly\doges.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\bubblegumhard.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\demonic_frost_miner.dm"
#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\drakehard.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\gladiator.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\glaurung.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\king_of_goats.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\legionhard.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\rogueprocess.dm"
#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\sif.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\imp.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\miningmobs.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\shamblingminer.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\candy.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\drakeling.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\fanaticminer.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\legionnaire.dm"
+#include "sandcode\code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm"
#include "sandcode\code\modules\ninja\outfit.dm"
#include "sandcode\code\modules\power\port_gen.dm"
#include "sandcode\code\modules\projectiles\guns\ballistic\pistol.dm"
+#include "sandcode\code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "sandcode\code\modules\reagents\chemistry\reagents\other_reagents.dm"
#include "sandcode\code\modules\reagents\reagent_containers\spray.dm"
#include "sandcode\code\modules\research\designs\autolathe_designs.dm"
@@ -3595,6 +3641,9 @@
#include "sandcode\code\modules\research\techweb\bluespace_nodes.dm"
#include "sandcode\code\modules\research\techweb\nodes\computer_hud_nodes.dm"
#include "sandcode\code\modules\research\techweb\nodes\robotics_nodes.dm"
+#include "sandcode\code\modules\ruins\lavalandruin_code\doom.dm"
+#include "sandcode\code\modules\ruins\lavalandruin_code\kinggoat.dm"
+#include "sandcode\code\modules\ruins\lavalandruin_code\misc.dm"
#include "sandcode\code\modules\shuttle\spaceship_navigation_beacon.dm"
#include "sandcode\code\modules\spells\spell.dm"
#include "sandcode\code\modules\spells\spell_types\shapeshift.dm"
@@ -3603,5 +3652,6 @@
#include "sandcode\code\modules\telescience\telesci.dm"
#include "sandcode\code\modules\telescience\telesci_computer.dm"
#include "sandcode\code\modules\uplink\uplink_items.dm"
+#include "sandcode\code\modules\uplink\uplink_roles.dm"
#include "sandcode\tools\Redirector\textprocs.dm"
// END_INCLUDE