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"