diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 3d5f72946dd..414d49d88ba 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/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 7011e33b79e..8e318135b53 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -1,8 +1,8 @@
/mob/living/simple_animal/hostile/megafauna/dragon
name = "ash drake"
desc = "Guardians of the necropolis."
- health = 2000
- maxHealth = 2000
+ health = 2500
+ maxHealth = 2500
attacktext = "chomps"
attack_sound = 'sound/magic/demon_attack1.ogg'
icon_state = "dragon"
@@ -20,19 +20,24 @@
flying = 1
aggro_vision_range = 18
idle_vision_range = 5
- del_on_death = 1
+ 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/asteroid/goliath_hide = 8, /obj/item/stack/sheet/bone = 30)
var/anger_modifier = 0
var/obj/item/device/gps/internal
var/swooping = 0
+ 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/death(gibbed)
if(can_die)
qdel(internal)
+ visible_message("[src] explodes in a shower of gore!")
playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1)
+ gib()
..()
/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
@@ -41,6 +46,9 @@
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"
@@ -78,12 +86,12 @@
ranged_cooldown = world.time + ranged_cooldown_time
if(prob(15 + anger_modifier))
- if(health > maxHealth/2)
- fire_rain()
- else
+ if(health < maxHealth/2 && !client)
swoop_attack(1)
+ else
+ fire_rain()
- else if(prob(10+anger_modifier))
+ else if(prob(10+anger_modifier) && !client)
if(health > maxHealth/2)
swoop_attack()
else
@@ -94,6 +102,7 @@
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(5))
new /obj/effect/overlay/temp/target(turf)
@@ -124,6 +133,7 @@
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
@@ -145,11 +155,13 @@
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(60)
+ 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)
@@ -160,4 +172,153 @@
icon_state = null
gpstag = "Fiery Signal"
desc = "Here there be dragons."
- invisibility = 100
\ No newline at end of file
+ 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
+ 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/antag_spawner/slaughter_demon/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))
+
+ 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 + 300
+
+/obj/structure/closet/crate/necropolis/dragon
+ name = "dragon chest"
+
+/obj/structure/closet/crate/dragon/tendril/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
index 85d582db100..7c5d48827e2 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -84,6 +84,9 @@
src.loot = list(/obj/structure/closet/crate/necropolis)
..()
+/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"
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 6fb515c3d8f..61d721f92e4 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -7,6 +7,9 @@
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
var/can_die = FALSE //Used to prevent instagib/instakill attacks like the wand of death