@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 << "<span class='info'>[src] does not work on this sort of creature.</span>"
|
||||
return
|
||||
if(M.stat == DEAD)
|
||||
M.faction = list("neutral")
|
||||
M.revive(full_heal = 1, admin_revive = 1)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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("<span class='danger'>Fire rains from the sky!</span>")
|
||||
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("<span class='danger'>[src] swoops up high!</span>")
|
||||
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("<span class='danger'>[src] slams down on [L], crushing them!</span>")
|
||||
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("<span class='danger'>[L] is thrown clear of [src]!</span>")
|
||||
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("<span class='danger'>[user] strikes with the force of [ghost_counter] vengeful spirits!</span>")
|
||||
..()
|
||||
|
||||
/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("<span class='danger'>[owner] is protected by a ring of [ghost_counter] ghosts!</span>")
|
||||
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 << "<span class='danger'>The blood sears your insides! What the hell were you thinking?</span>"
|
||||
user.reagents.add_reagent("hellwater", 50)
|
||||
if(2)
|
||||
user << "<span class='danger'>Other than tasting terrible, nothing really happens.</span>"
|
||||
if(3)
|
||||
user << "<span class='danger'>Your flesh begins to melt! Miraculously, you seem fine otherwise.</span>"
|
||||
H.set_species(/datum/species/skeleton)
|
||||
if(4)
|
||||
user << "<span class='danger'>The blood mixes with your own, filling your veins with a pulsing fire.</span>"
|
||||
H.dna.species.coldmod = 0
|
||||
if(5)
|
||||
user << "<span class='danger'>You don't feel so good...</span>"
|
||||
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("<span class='danger'>You have an overwhelming urge to terrorize some peasants.</span>", "<span class='danger'>Your teeth feel sharper.</span>")
|
||||
stage4 = list("<span class='danger'>Your blood burns.</span>")
|
||||
stage5 = list("<span class='danger'>You're a fucking dragon.</span>")
|
||||
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("<span class='danger'>[user] turns \the [O] into lava!</span>")
|
||||
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)
|
||||
@@ -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("<span class='danger'>[src] charges!</span>")
|
||||
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("<span class='danger'>[src] splits!</span>")
|
||||
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 << "<span class='danger'><B>With an appropriately dramatic flourish, you dispell the storm.</B>"
|
||||
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 << "<span class='danger'><B>You lift the staff towards the heavens, calling down a terrible storm.</B>"
|
||||
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."
|
||||
@@ -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
|
||||
..()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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("<span class='danger'>[deathmessage]</span>")
|
||||
else if(!del_on_death)
|
||||
|
||||
@@ -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("<span class='danger'>Legion emerges from the Necropolis!</span>")
|
||||
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("<span class='warning'>Tendrils reach out from \the [src.name] pulling [H] in! Blood seeps over the eggs as [H] is devoured.</span>")
|
||||
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()
|
||||
|
||||
@@ -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
|
||||
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.4 KiB |
@@ -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"
|
||||
|
||||