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