diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 928ce91fe3d..a83f410d5ff 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -316,6 +316,7 @@ var/list/bloody_footprints_cache = list()
#define SENTIENCE_ARTIFICIAL 2
#define SENTIENCE_OTHER 3
#define SENTIENCE_MINEBOT 4
+#define SENTIENCE_BOSS 5
//Fire stuff, for burn_state
#define LAVA_PROOF -2
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 10d99b7dc57..8ed824052bd 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -18,7 +18,7 @@
status_flags = CANPUSH
attack_sound = 'sound/magic/demon_attack1.ogg'
var/feast_sound = 'sound/magic/Demon_consume.ogg'
- var/death_sound = 'sound/magic/demon_dies.ogg'
+ death_sound = 'sound/magic/demon_dies.ogg'
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
maxbodytemp = INFINITY
@@ -60,10 +60,6 @@
else
speed = 0
-/mob/living/simple_animal/slaughter/death()
- playsound(get_turf(src),death_sound, 200, 1)
- ..()
-
/obj/effect/decal/cleanable/blood/innards
icon = 'icons/obj/surgery.dmi'
name = "pile of viscera"
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 881eced9a21..83ccf9f5a47 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -861,6 +861,7 @@
throw_range = 5
var/loaded = 1
var/malfunctioning = 0
+ var/revive_type = SENTIENCE_ORGANIC //So you can't revive boss monsters or robots with it
origin_tech = "biotech=4"
/obj/item/weapon/lazarus_injector/afterattack(atom/target, mob/user, proximity_flag)
@@ -869,6 +870,9 @@
if(istype(target, /mob/living) && proximity_flag)
if(istype(target, /mob/living/simple_animal))
var/mob/living/simple_animal/M = target
+ if(M.sentience_type != revive_type)
+ user << "[src] does not work on this sort of creature."
+ return
if(M.stat == DEAD)
M.faction = list("neutral")
M.revive(full_heal = 1, admin_revive = 1)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 491db033ef7..02a75bcc1fa 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -255,7 +255,7 @@
/turf/open/floor/plating/asteroid/airless/cave/volcanic
mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goldgrub = 10, /mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30,
- /mob/living/simple_animal/hostile/spawner/lavaland = 2, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3)
+ /mob/living/simple_animal/hostile/spawner/lavaland = 2, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, /mob/living/simple_animal/hostile/megafauna/dragon = 2)
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = "o2=14;n2=23;TEMP=300"
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index d8350a4bab9..e1b8695c437 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -31,6 +31,8 @@
see_invisible = SEE_INVISIBLE_MINIMUM
unique_name = 1
gold_core_spawnable = 0
+ death_sound = 'sound/voice/hiss6.ogg'
+ deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
/mob/living/simple_animal/hostile/alien/drone
name = "alien drone"
@@ -140,11 +142,6 @@
damage = 30
icon_state = "toxin"
-/mob/living/simple_animal/hostile/alien/death(gibbed)
- ..(gibbed)
- visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...")
- playsound(src, 'sound/voice/hiss6.ogg', 100, 1)
-
/mob/living/simple_animal/hostile/alien/handle_temperature_damage()
if(bodytemperature < minbodytemp)
adjustBruteLoss(2)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
new file mode 100644
index 00000000000..0fe95918f9f
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -0,0 +1,323 @@
+/mob/living/simple_animal/hostile/megafauna/dragon
+ name = "ash drake"
+ desc = "Guardians of the necropolis."
+ health = 2500
+ maxHealth = 2500
+ attacktext = "chomps"
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ icon_state = "dragon"
+ icon_living = "dragon"
+ icon_dead = "dragon_dead"
+ friendly = "stares down"
+ icon = 'icons/mob/lavaland/dragon.dmi'
+ faction = list("mining")
+ speak_emote = list("roars")
+ armour_penetration = 40
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ speed = 1
+ move_to_delay = 10
+ ranged = 1
+ flying = 1
+ mob_size = MOB_SIZE_LARGE
+ pixel_x = -16
+ aggro_vision_range = 18
+ idle_vision_range = 5
+ loot = list(/obj/structure/closet/crate/necropolis/dragon)
+ butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/goliath_hide = 8, /obj/item/stack/sheet/bone = 30)
+ var/anger_modifier = 0
+ var/obj/item/device/gps/internal
+ var/swooping = 0
+ deathmessage = "collapes into a pile of bones, it's flesh sloughing away."
+ death_sound = 'sound/magic/demon_dies.ogg'
+ damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/New()
+ ..()
+ internal = new/obj/item/device/gps/internal/dragon(src)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
+ if(swooping)
+ return
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/obj/effect/overlay/temp/fireball
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "fireball"
+ name = "fireball"
+ desc = "Get out of the way!"
+ layer = 6
+ dir = SOUTH
+ pixel_z = 500
+ anchored = 1
+
+/obj/effect/overlay/temp/target
+ icon = 'icons/mob/actions.dmi'
+ icon_state = "sniper_zoom"
+ layer = MOB_LAYER - 0.1
+ anchored = 1
+ luminosity = 2
+
+/obj/effect/overlay/temp/target/ex_act()
+ return
+
+/obj/effect/overlay/temp/target/New()
+ ..()
+ spawn()
+ var/turf/T = get_turf(src)
+ playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
+ var/obj/effect/overlay/temp/fireball/F = new(src.loc)
+ animate(F, pixel_z = 0, time = 12)
+ sleep(12)
+ explosion(T, 0, 0, 1, 0, 1, 0)
+ qdel(F)
+ qdel(src)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire()
+ anger_modifier = Clamp(((maxHealth - health)/50),0,20)
+ ranged_cooldown = world.time + ranged_cooldown_time
+
+ if(prob(15 + anger_modifier))
+ if(health < maxHealth/2 && !client)
+ swoop_attack(1)
+ else
+ fire_rain()
+
+ else if(prob(10+anger_modifier) && !client)
+ if(health > maxHealth/2)
+ swoop_attack()
+ else
+ swoop_attack()
+ swoop_attack()
+ swoop_attack()
+ else
+ fire_walls()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_rain()
+ visible_message("Fire rains from the sky!")
+ for(var/turf/turf in range(12,get_turf(src)))
+ if(prob(10))
+ new /obj/effect/overlay/temp/target(turf)
+
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/fire_walls()
+ var/list/attack_dirs = list(NORTH,EAST,SOUTH,WEST)
+ if(prob(50))
+ attack_dirs = list(NORTH,WEST,SOUTH,EAST)
+ playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
+
+ spawn(0)
+ for(var/d in attack_dirs)
+ var/turf/E = get_edge_target_turf(src, d)
+ var/range = 10
+ for(var/turf/open/J in getline(src,E))
+ if(!range)
+ break
+ range--
+
+ PoolOrNew(/obj/effect/hotspot,J)
+ J.hotspot_expose(700,50,1)
+
+/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_attack(fire_rain = 0)
+ if(stat)
+ return
+ var/mob/living/swoop_target = target
+ stop_automated_movement = TRUE
+ swooping = 1
+ icon_state = "swoop"
+ visible_message("[src] swoops up high!")
+ if(prob(50))
+ animate(src, pixel_x = 500, pixel_z = 500, time = 10)
+ else
+ animate(src, pixel_x = -500, pixel_z = 500, time = 10)
+ sleep(30)
+
+ var/turf/tturf
+ if(fire_rain)
+ fire_rain()
+
+ icon_state = "dragon"
+ if(swoop_target)
+ tturf = get_turf(swoop_target)
+ else
+ tturf = get_turf(src)
+ src.loc = tturf
+ animate(src, pixel_x = 0, pixel_z = 0, time = 10)
+ sleep(10)
+ playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1)
+ for(var/mob/living/L in range(1,tturf))
+ if(L.stat)
+ visible_message("[src] slams down on [L], crushing them!")
+ L.gib()
+ else
+ var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
+ L.adjustBruteLoss(75)
+ L.throw_at_fast(throwtarget)
+ visible_message("[L] is thrown clear of [src]!")
+ for(var/mob/M in range(7,src))
+ shake_camera(M, 15, 1)
+
+ stop_automated_movement = FALSE
+ swooping = 0
+ density = 1
+
+/obj/item/device/gps/internal/dragon
+ icon_state = null
+ gpstag = "Fiery Signal"
+ desc = "Here there be dragons."
+ invisibility = 100
+
+
+//The part you've all been waiting for: Loot
+
+/obj/item/weapon/melee/ghost_sword
+ name = "spectral blade"
+ desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly."
+ icon_state = "cultblade"
+ item_state = "cultblade"
+ flags = CONDUCT
+ sharpness = IS_SHARP
+ w_class = 4
+ force = 1
+ throwforce = 1
+ hitsound = 'sound/effects/ghost2.ogg'
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
+ var/summon_cooldown = 0
+
+/obj/item/weapon/melee/ghost_sword/attack_self(mob/user)
+ if(summon_cooldown > world.time)
+ return
+ notify_ghosts("[user] is raising their [src], calling for your help!", source = user)
+ summon_cooldown = world.time + 600
+
+/obj/item/weapon/melee/ghost_sword/proc/ghost_check(mob/user)
+ var/ghost_counter = 0
+ for(var/mob/dead/observer/G in dead_mob_list)
+ if(G.orbiting == user)
+ ghost_counter++
+ G.invisibility = 0
+ spawn(30)
+ G.invisibility = initial(G.invisibility)
+ return ghost_counter
+
+/obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
+ force = 0
+ var/ghost_counter = ghost_check(user)
+
+ force = Clamp((ghost_counter * 4), 0, 75)
+ user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!")
+ ..()
+
+/obj/item/weapon/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ var/ghost_counter = ghost_check(owner)
+ final_block_chance += Clamp((ghost_counter * 5), 0, 75)
+ owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!")
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/dragon/lesser
+ name = "lesser ash drake"
+ maxHealth = 500
+ health = 500
+ melee_damage_upper = 30
+ melee_damage_lower = 30
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ loot = list()
+
+//Blood
+
+/obj/item/weapon/dragons_blood
+ name = "bottle of dragons blood"
+ desc = "You're not actually going to drink this, are you?"
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vial"
+
+/obj/item/weapon/dragons_blood/attack_self(mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+
+ var/mob/living/carbon/human/H = user
+ var/random = rand(1,5)
+
+ switch(random)
+ if(1)
+ user << "The blood sears your insides! What the hell were you thinking?"
+ user.reagents.add_reagent("hellwater", 50)
+ if(2)
+ user << "Other than tasting terrible, nothing really happens."
+ if(3)
+ user << "Your flesh begins to melt! Miraculously, you seem fine otherwise."
+ H.set_species(/datum/species/skeleton)
+ if(4)
+ user << "The blood mixes with your own, filling your veins with a pulsing fire."
+ H.dna.species.coldmod = 0
+ if(5)
+ user << "You don't feel so good..."
+ H.ForceContractDisease(new /datum/disease/transformation/dragon(0))
+ playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ qdel(src)
+
+/datum/disease/transformation/dragon
+ name = "dragon transformation"
+ cure_text = "nothing"
+ cures = list("adminordrazine")
+ agent = "dragon's blood"
+ desc = "What do dragons have to do with Space Station 13?"
+ stage_prob = 20
+ severity = BIOHAZARD
+ visibility_flags = 0
+ stage1 = list("Your bones ache.")
+ stage2 = list("Your skin feels scaley.")
+ stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.")
+ stage4 = list("Your blood burns.")
+ stage5 = list("You're a fucking dragon.")
+ new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
+
+
+//Lava Staff
+
+/obj/item/weapon/lava_staff
+ name = "staff of lava"
+ desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?"
+ icon_state = "staffofstorms"
+ item_state = "staffofstorms"
+ icon = 'icons/obj/guns/magic.dmi'
+ slot_flags = SLOT_BACK
+ item_state = "staffofstorms"
+ w_class = 4
+ force = 25
+ damtype = BURN
+ hitsound = 'sound/weapons/sear.ogg'
+ var/lava_cooldown = 0
+
+/obj/item/weapon/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ ..()
+ if(lava_cooldown > world.time)
+ return
+ if(target && istype(target, /turf/open))
+ var/turf/open/O = target
+ user.visible_message("[user] turns \the [O] into lava!")
+ O.ChangeTurf(/turf/open/floor/plating/lava/smooth)
+ playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
+ lava_cooldown = world.time + 200
+
+/obj/structure/closet/crate/necropolis/dragon
+ name = "dragon chest"
+
+/obj/structure/closet/crate/necropolis/dragon/New()
+ ..()
+ var/loot = rand(1,4)
+ switch(loot)
+ if(1)
+ for(var/i in 1 to 10)
+ new /obj/item/weapon/ore/diamond(src)
+ new /obj/item/weapon/ore/gold(src)
+ if(2)
+ new /obj/item/weapon/melee/ghost_sword(src)
+ if(3)
+ new /obj/item/weapon/dragons_blood(src)
+ if(4)
+ new /obj/item/weapon/lava_staff(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
new file mode 100644
index 00000000000..8a6ac9c33ca
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -0,0 +1,140 @@
+/mob/living/simple_animal/hostile/megafauna/legion
+ name = "legion"
+ health = 800
+ maxHealth = 800
+ icon_state = "legion"
+ icon_living = "legion"
+ desc = "One of many."
+ icon = 'icons/mob/lavaland/legion.dmi'
+ attacktext = "chomps"
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ faction = list("mining")
+ speak_emote = list("echoes")
+ armour_penetration = 50
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ speed = 2
+ ranged = 1
+ flying = 1
+ del_on_death = 1
+ retreat_distance = 5
+ minimum_distance = 5
+ ranged_cooldown_time = 20
+ var/size = 10
+ var/charging = 0
+ pixel_y = -90
+ pixel_x = -75
+ loot = list(/obj/item/stack/sheet/bone = 3)
+ vision_range = 13
+ aggro_vision_range = 18
+ idle_vision_range = 13
+
+/mob/living/simple_animal/hostile/megafauna/legion/New()
+ ..()
+ new/obj/item/device/gps/internal/legion(src)
+
+/mob/living/simple_animal/hostile/megafauna/legion/OpenFire(the_target)
+ if(world.time >= ranged_cooldown && !charging)
+ if(prob(75))
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(src.loc)
+ A.GiveTarget(target)
+ A.friends = friends
+ A.faction = faction
+ ranged_cooldown = world.time + ranged_cooldown_time
+ else
+ visible_message("[src] charges!")
+ SpinAnimation(speed = 20, loops = 5)
+ ranged = 0
+ retreat_distance = 0
+ minimum_distance = 0
+ speed = 0
+ charging = 1
+ spawn(50)
+ ranged = 1
+ retreat_distance = 5
+ minimum_distance = 5
+ speed = 2
+ charging = 0
+
+/mob/living/simple_animal/hostile/megafauna/legion/death()
+ if(size > 2)
+ for(var/i in 1 to 2)
+ var/mob/living/simple_animal/hostile/megafauna/legion/L = new(src.loc)
+ L.health = src.maxHealth * 0.6
+ L.maxHealth = L.health
+ L.size = size - 2
+ var/size_multiplier = L.size * 0.08
+ L.resize = size_multiplier
+ L.pixel_y = L.pixel_y * size_multiplier
+ L.pixel_x = L.pixel_x * size_multiplier
+
+ L.update_transform()
+ visible_message("[src] splits!")
+ qdel(src)
+ else
+ var/last_legion = TRUE
+ for(var/mob/living/simple_animal/hostile/megafauna/legion/other in mob_list)
+ if(other != src)
+ last_legion = FALSE
+ break
+ if(last_legion)
+ src.loot = list(/obj/item/weapon/staff_of_storms)
+ else if(prob(5))
+ src.loot = list(/obj/structure/closet/crate/necropolis/tendril)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/legion/Process_Spacemove(movement_dir = 0)
+ return 1
+
+/obj/item/device/gps/internal/legion
+ icon_state = null
+ gpstag = "Echoing Signal"
+ desc = "The message repeats."
+ invisibility = 100
+
+
+//Loot
+
+/obj/item/weapon/staff_of_storms
+ name = "staff of storms"
+ desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it."
+ icon_state = "staffofstorms"
+ item_state = "staffofstorms"
+ icon = 'icons/obj/guns/magic.dmi'
+ slot_flags = SLOT_BACK
+ item_state = "staffofstorms"
+ w_class = 4
+ force = 25
+ damtype = BURN
+ hitsound = 'sound/weapons/sear.ogg'
+ var/obj/machinery/lavaland_controller/linked_machine
+ var/storm_cooldown = 0
+
+/obj/item/weapon/staff_of_storms/attack_self(mob/user)
+ if(storm_cooldown > world.time)
+ user << "The staff is still recharging."
+ return
+
+ if(!linked_machine || linked_machine.z != user.z)
+ for(var/obj/machinery/lavaland_controller/controller in machines)
+ if(controller.z == user.z)
+ linked_machine = controller
+ break
+
+ if(linked_machine && linked_machine.ongoing_weather)
+ if(linked_machine.ongoing_weather.stage == WIND_DOWN_STAGE || linked_machine.ongoing_weather.stage == END_STAGE)
+ user << "The storm is already ending. It would be a waste to use the staff now."
+ return
+ linked_machine.ongoing_weather.duration = 0
+ user << "With an appropriately dramatic flourish, you dispell the storm."
+ playsound(get_turf(src),'sound/magic/Staff_Change.ogg', 200, 1)
+ storm_cooldown = world.time + 600
+
+ else if (linked_machine && !linked_machine.ongoing_weather)
+ user << "You lift the staff towards the heavens, calling down a terrible storm."
+ linked_machine.weather_cooldown = 0
+ playsound(get_turf(src),'sound/magic/Staff_Change.ogg', 200, 1)
+ storm_cooldown = world.time + 600
+
+ else
+ user << "You can't seem to control the weather here."
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
new file mode 100644
index 00000000000..6a273d83b3e
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -0,0 +1,33 @@
+/mob/living/simple_animal/hostile/megafauna
+ name = "boss of this gym"
+ desc = "Attack the weak point for massive damage."
+ health = 1000
+ maxHealth = 1000
+ sentience_type = SENTIENCE_BOSS
+ environment_smash = 4
+ robust_searching = 1
+ stat_attack = 1
+ 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
+ maxbodytemp = INFINITY
+ layer = 6 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
+
+/mob/living/simple_animal/hostile/megafauna/death(gibbed)
+ if(health > 0)
+ return
+ else
+ feedback_set_details("megafauna_kills","[initial(name)]")
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/gib()
+ if(health > 0)
+ return
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/dust()
+ if(health > 0)
+ return
+ else
+ ..()
+
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 82c1949e81d..cd7ca202dbb 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -713,6 +713,7 @@
del_on_death = 1
stat_attack = 1
robust_searching = 1
+ layer = 6.1
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life()
if(isturf(src.loc))
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 887a1ab0275..a6e4fbf2e00 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -72,6 +72,7 @@
var/list/loot = list() //list of things spawned at mob's loc when it dies
var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses
var/deathmessage = ""
+ var/death_sound = null //The sound played on death
var/allow_movement_on_non_turfs = FALSE
@@ -391,6 +392,8 @@
if(loot.len)
for(var/i in loot)
new i(loc)
+ if(death_sound)
+ playsound(get_turf(src),death_sound, 200, 1)
if(deathmessage && !gibbed)
visible_message("[deathmessage]")
else if(!del_on_death)
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index dfccd3e31dd..576cf63d6ba 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -9,6 +9,23 @@
bound_height = 96
burn_state = LAVA_PROOF
luminosity = 1
+ var/boss = FALSE
+
+/obj/structure/lavaland_door/attack_hand(mob/user)
+ if(boss)
+ return
+ for(var/mob/living/simple_animal/hostile/megafauna/legion/L in mob_list)
+ return
+ var/safety = alert(user, "Are you sure you want to do this? You and everyone else on lavaland will likely die.", "Knock on the door?", "Proceed", "Abort")
+ if(safety == "Abort" || !in_range(src, user) || !src || boss || user.incapacitated())
+ return
+ boss = TRUE
+ user << "You knock on the door."
+ playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
+ visible_message("Legion emerges from the Necropolis!")
+ message_admins("[key_name_admin(user)] has summoned Legion.")
+ log_game("[key_name(user)] summoned Legion.")
+ new /mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH))
/obj/structure/lavaland_door/singularity_pull()
return 0
@@ -21,23 +38,21 @@
desc = "Controls the weather."
icon = 'icons/obj/machines/telecomms.dmi'
icon_state = "processor"
- var/ongoing_weather = FALSE
+ var/datum/weather/ongoing_weather = FALSE
var/weather_cooldown = 0
/obj/machinery/lavaland_controller/process()
if(ongoing_weather || weather_cooldown > world.time)
return
- ongoing_weather = TRUE
weather_cooldown = world.time + rand(3500, 6500)
var/datum/weather/ash_storm/LAVA = new /datum/weather/ash_storm
+ ongoing_weather = LAVA
LAVA.weather_start_up()
- ongoing_weather = FALSE
+ ongoing_weather = null
/obj/machinery/lavaland_controller/Destroy()
return QDEL_HINT_LETMELIVE
-
-
//lavaland_surface_seed_vault.dmm
//Seed Vault
@@ -189,7 +204,10 @@
if(H.stat)
visible_message("Tendrils reach out from \the [src.name] pulling [H] in! Blood seeps over the eggs as [H] is devoured.")
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
- meat_counter ++
+ if(istype(H,/mob/living/simple_animal/hostile/megafauna/dragon))
+ meat_counter += 20
+ else
+ meat_counter ++
H.gib()
/mob/living/simple_animal/hostile/spawner/ash_walker/spawn_mob()
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index e7648cc9b7b..6c3a5cace28 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -101,6 +101,7 @@ var/list/GPS_list = list()
/obj/item/device/gps/internal
icon_state = null
+ flags = ABSTRACT
gpstag = "Eerie Signal"
desc = "Report to a coder immediately."
invisibility = 100
\ No newline at end of file
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 04204d0eb95..1073f20a6fd 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index a46ec15610d..e4bb3a035c8 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index cc63b0497cf..288dedf21f4 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/lavaland/dragon.dmi b/icons/mob/lavaland/dragon.dmi
new file mode 100644
index 00000000000..7e44b775de8
Binary files /dev/null and b/icons/mob/lavaland/dragon.dmi differ
diff --git a/icons/mob/lavaland/legion.dmi b/icons/mob/lavaland/legion.dmi
new file mode 100644
index 00000000000..c3a33d09a09
Binary files /dev/null and b/icons/mob/lavaland/legion.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 2f3fc52957a..d5d4910184b 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 51878b33da4..4e3ceff9091 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1417,6 +1417,9 @@
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\zombie.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
+#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm"