mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-28 15:47:15 +01:00
@@ -442,17 +442,33 @@
|
||||
src.used = TRUE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///Bosses
|
||||
|
||||
|
||||
|
||||
|
||||
//Dragon
|
||||
|
||||
/obj/structure/closet/crate/necropolis/dragon
|
||||
name = "dragon chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/dragon/New()
|
||||
..()
|
||||
var/loot = rand(1,2)
|
||||
var/loot = rand(1,4)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/weapon/melee/ghost_sword(src)
|
||||
if(2)
|
||||
new /obj/item/weapon/lava_staff(src)
|
||||
if(3)
|
||||
new /obj/item/weapon/spellbook/oneuse/fireball(src)
|
||||
new /obj/item/weapon/gun/magic/wand/fireball(src)
|
||||
if(4)
|
||||
new /obj/item/weapon/dragons_blood(src)
|
||||
|
||||
/obj/item/weapon/melee/ghost_sword
|
||||
name = "spectral blade"
|
||||
@@ -549,7 +565,7 @@
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/random = rand(1,3)
|
||||
var/random = rand(1,4)
|
||||
|
||||
switch(random)
|
||||
if(1)
|
||||
@@ -561,6 +577,9 @@
|
||||
user << "<span class='danger'>You don't feel so good...</span>"
|
||||
message_admins("[key_name_admin(user)](<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has started transforming into a dragon via dragon's blood.")
|
||||
H.ForceContractDisease(new /datum/disease/transformation/dragon(0))
|
||||
if(4)
|
||||
user << "<span class='danger'>You feel like you could walk straight through lava now.</span>"
|
||||
H.weather_immunities |= "lava"
|
||||
|
||||
playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
qdel(src)
|
||||
@@ -578,7 +597,7 @@
|
||||
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>")
|
||||
stage5 = list("<span class='danger'>You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.</span>")
|
||||
new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser
|
||||
|
||||
|
||||
@@ -620,3 +639,74 @@
|
||||
O.ChangeTurf(turf_type)
|
||||
playsound(get_turf(src),'sound/magic/Fireball.ogg', 200, 1)
|
||||
timer = world.time + cooldown
|
||||
|
||||
///Bubblegum
|
||||
|
||||
/obj/item/mayhem
|
||||
name = "mayhem in a bottle"
|
||||
desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "vial"
|
||||
|
||||
/obj/item/mayhem/attack_self(mob/user)
|
||||
for(var/mob/living/carbon/human/H in range(7,user))
|
||||
spawn()
|
||||
var/obj/effect/mine/pickup/bloodbath/B = new(H)
|
||||
B.mineEffect(H)
|
||||
user << "<span class='notice'>You shatter the bottle!</span>"
|
||||
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum
|
||||
name = "bubblegum chest"
|
||||
|
||||
/obj/structure/closet/crate/necropolis/bubblegum/New()
|
||||
..()
|
||||
var/loot = rand(1,3)
|
||||
switch(loot)
|
||||
if(1)
|
||||
new /obj/item/weapon/antag_spawner/slaughter_demon(src)
|
||||
if(2)
|
||||
new /obj/item/mayhem(src)
|
||||
if(3)
|
||||
new /obj/item/blood_contract(src)
|
||||
|
||||
/obj/item/blood_contract
|
||||
name = "blood contract"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "scroll2"
|
||||
color = "#FF0000"
|
||||
desc = "Mark your target for death. "
|
||||
var/used = FALSE
|
||||
|
||||
/obj/item/blood_contract/attack_self(mob/user)
|
||||
if(used)
|
||||
return
|
||||
used = TRUE
|
||||
var/choice = input(user,"Who do you want dead?","Pick Reinforcement") as null|anything in player_list
|
||||
|
||||
if(!(isliving(choice)))
|
||||
user << "[choice] is already dead!"
|
||||
used = FALSE
|
||||
else
|
||||
|
||||
var/mob/living/L = choice
|
||||
|
||||
message_admins("<span class='adminnotice'>[L] has been marked for death!</span>")
|
||||
|
||||
var/datum/objective/survive/survive = new
|
||||
survive.owner = L.mind
|
||||
L.mind.objectives += survive
|
||||
L << "<span class='userdanger'>You've been marked for death! Don't let the demons get you!</span>"
|
||||
L.color = "#FF0000"
|
||||
spawn()
|
||||
var/obj/effect/mine/pickup/bloodbath/B = new(L)
|
||||
B.mineEffect(L)
|
||||
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H == L)
|
||||
continue
|
||||
H << "<span class='userdanger'>You have an overwhelming desire to kill [L]. They have been marked red! Go kill them!</span>"
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife/butcher(H), slot_l_hand)
|
||||
|
||||
qdel(src)
|
||||
@@ -263,7 +263,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/megafauna/dragon = 2)
|
||||
/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, /mob/living/simple_animal/hostile/megafauna/bubblegum = 2, /mob/living/simple_animal/hostile/megafauna/colossus = 2)
|
||||
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = "o2=14;n2=23;TEMP=300"
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum
|
||||
name = "bubblegum"
|
||||
desc = "In what passes for a heirarchy among slaughter demons, this one is king."
|
||||
health = 2500
|
||||
maxHealth = 2500
|
||||
attacktext = "rends"
|
||||
attack_sound = 'sound/magic/demon_attack1.ogg'
|
||||
icon_state = "bubblegum"
|
||||
icon_living = "bubblegum"
|
||||
icon_dead = ""
|
||||
friendly = "stares down"
|
||||
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
speak_emote = list("gurgles")
|
||||
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 = -32
|
||||
del_on_death = 1
|
||||
aggro_vision_range = 18
|
||||
idle_vision_range = 5
|
||||
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
|
||||
var/charging = 0
|
||||
deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... "
|
||||
death_sound = 'sound/magic/enter_blood.ogg'
|
||||
|
||||
/obj/item/device/gps/internal/bubblegum
|
||||
icon_state = null
|
||||
gpstag = "Bloody Signal"
|
||||
desc = "You're not quite sure how a signal can be bloody."
|
||||
invisibility = 100
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/Life()
|
||||
..()
|
||||
move_to_delay = Clamp(round((health/maxHealth) * 10), 5, 10)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
|
||||
var/anger_modifier = Clamp(((maxHealth - health)/50),0,20)
|
||||
ranged_cooldown = world.time + ranged_cooldown_time
|
||||
|
||||
if(!charging)
|
||||
blood_warp()
|
||||
|
||||
if(prob(25))
|
||||
blood_spray()
|
||||
|
||||
else if(prob(5+anger_modifier/2))
|
||||
slaughterlings()
|
||||
else
|
||||
if(health > maxHealth/2 && !client && !charging)
|
||||
charge()
|
||||
else
|
||||
charge()
|
||||
sleep(10)
|
||||
charge()
|
||||
sleep(10)
|
||||
charge()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/New()
|
||||
..()
|
||||
for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in mob_list)
|
||||
if(B != src)
|
||||
qdel(src) //There can be only one
|
||||
break
|
||||
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
|
||||
AddSpell(bloodspell)
|
||||
if(istype(loc, /obj/effect/dummy/slaughter))
|
||||
bloodspell.phased = 1
|
||||
new/obj/item/device/gps/internal/bubblegum(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
|
||||
if(charging)
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
|
||||
if(!stat)
|
||||
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1)
|
||||
if(charging)
|
||||
PoolOrNew(/obj/effect/overlay/temp/decoy, list(loc,src))
|
||||
for(var/turf/T in range(src, 1))
|
||||
T.singularity_pull(src, 7)
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge()
|
||||
var/turf/T = get_step_away(target, src)
|
||||
charging = 1
|
||||
new/obj/effect/overlay/temp/dragon_swoop(T)
|
||||
sleep(5)
|
||||
throw_at(T, 7, 1, src, 0)
|
||||
charging = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/Bump(atom/A)
|
||||
if(charging)
|
||||
if(istype(A, /turf) || istype(A, /obj) && A.density)
|
||||
A.ex_act(2)
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/A)
|
||||
if(!charging)
|
||||
return ..()
|
||||
|
||||
else if(A)
|
||||
if(isliving(A))
|
||||
var/mob/living/L = A
|
||||
L.visible_message("<span class='danger'>[src] slams into [L]!</span>", "<span class='userdanger'>[src] slams into you!</span>")
|
||||
L.apply_damage(40, BRUTE)
|
||||
playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
|
||||
shake_camera(L, 4, 3)
|
||||
shake_camera(src, 2, 3)
|
||||
var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
|
||||
L.throw_at_fast(throwtarget)
|
||||
|
||||
charging = 0
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
|
||||
var/found_bloodpool = FALSE
|
||||
for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2))
|
||||
found_bloodpool = TRUE
|
||||
if(found_bloodpool)
|
||||
for(var/obj/effect/decal/cleanable/blood/H in view(target,2))
|
||||
visible_message("<span class='danger'>[src] sinks into the blood...</span>")
|
||||
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
|
||||
forceMove(get_turf(H))
|
||||
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
|
||||
visible_message("<span class='danger'>And springs back out!</span>")
|
||||
break
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray()
|
||||
visible_message("<span class='danger'>[src] sprays a stream of gore!</span>")
|
||||
spawn(0)
|
||||
var/turf/E = get_edge_target_turf(src, src.dir)
|
||||
var/range = 10
|
||||
for(var/turf/open/J in getline(src,E))
|
||||
if(!range)
|
||||
break
|
||||
playsound(J,'sound/effects/splat.ogg', 100, 1, -1)
|
||||
new /obj/effect/decal/cleanable/blood(J)
|
||||
range--
|
||||
sleep(1)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings()
|
||||
visible_message("<span class='danger'>[src] summons a shoal of slaughterlings!</span>")
|
||||
for(var/obj/effect/decal/cleanable/blood/H in range(src, 10))
|
||||
if(prob(25))
|
||||
new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter(H.loc)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter
|
||||
name = "slaughterling"
|
||||
desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you."
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
|
||||
@@ -0,0 +1,370 @@
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus
|
||||
name = "colossus"
|
||||
desc = "A monstrous creature protected by heavy shielding."
|
||||
health = 2500
|
||||
maxHealth = 2500
|
||||
attacktext = "judges"
|
||||
attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg'
|
||||
icon_state = "eva"
|
||||
icon_living = "eva"
|
||||
icon_dead = "dragon_dead"
|
||||
friendly = "stares down"
|
||||
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
|
||||
faction = list("mining")
|
||||
weather_immunities = list("lava","ash")
|
||||
speak_emote = list("roars")
|
||||
luminosity = 3
|
||||
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 = -32
|
||||
aggro_vision_range = 18
|
||||
idle_vision_range = 5
|
||||
del_on_death = 1
|
||||
loot = list(/obj/machinery/smartfridge/black_box)
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30)
|
||||
|
||||
deathmessage = "disintegrates, leaving a glowing core."
|
||||
death_sound = 'sound/magic/demon_dies.ogg'
|
||||
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
var/anger_modifier = 0
|
||||
var/obj/item/device/gps/internal
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/OpenFire()
|
||||
anger_modifier = Clamp(((maxHealth - health)/50),0,20)
|
||||
ranged_cooldown = world.time + 120
|
||||
|
||||
if(prob(20+anger_modifier)) //Major attack
|
||||
telegraph()
|
||||
|
||||
if(health < maxHealth/3)
|
||||
double_spiral()
|
||||
else
|
||||
visible_message("<span class='cult'><font size=5>\"<b>Judgement.</b>\"</font></span>")
|
||||
if(prob(50))
|
||||
spiral_shoot()
|
||||
else
|
||||
spiral_shoot(1)
|
||||
|
||||
else if(prob(20))
|
||||
ranged_cooldown = world.time + 30
|
||||
random_shots()
|
||||
else
|
||||
if(prob(70))
|
||||
ranged_cooldown = world.time + 20
|
||||
blast()
|
||||
else
|
||||
ranged_cooldown = world.time + 40
|
||||
diagonals()
|
||||
sleep(10)
|
||||
cardinals()
|
||||
sleep(10)
|
||||
diagonals()
|
||||
sleep(10)
|
||||
cardinals()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/New()
|
||||
..()
|
||||
internal = new/obj/item/device/gps/internal/colossus(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/Destroy()
|
||||
qdel(internal)
|
||||
. = ..()
|
||||
|
||||
/obj/effect/overlay/temp/at_shield
|
||||
name = "anti-toolbox field"
|
||||
desc = "A shimmering forcefield protecting the colossus."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "at_shield2"
|
||||
layer = FLY_LAYER
|
||||
luminosity = 2
|
||||
duration = 80
|
||||
var/target
|
||||
|
||||
/obj/effect/overlay/temp/at_shield/New()
|
||||
..()
|
||||
spawn()
|
||||
orbit(target, 0, FALSE, 0, 0, FALSE, TRUE)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
|
||||
if(!stat)
|
||||
var/obj/effect/overlay/temp/at_shield/AT = new(src.loc)
|
||||
AT.target = src
|
||||
var/random_x = rand(-32, 32)
|
||||
AT.pixel_x += random_x
|
||||
|
||||
var/random_y = rand(0, 72)
|
||||
AT.pixel_y += random_y
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral()
|
||||
visible_message("<span class='cult'><font size=5>\"<b>Die</b>\"</font></span>")
|
||||
|
||||
sleep(10)
|
||||
spawn()
|
||||
spiral_shoot()
|
||||
spawn()
|
||||
spiral_shoot(1)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = 0)
|
||||
spawn()
|
||||
var/counter = 1
|
||||
var/turf/marker
|
||||
for(var/i in 1 to 80)
|
||||
switch(counter)
|
||||
if(1)
|
||||
marker = locate(x,y - 2,z)
|
||||
if(2)
|
||||
marker = locate(x - 1,y - 2,z)
|
||||
if(3)
|
||||
marker = locate(x - 2, y - 2,z)
|
||||
if(4)
|
||||
marker = locate(x - 2,y - 1,z)
|
||||
if(5)
|
||||
marker = locate (x -2 ,y,z)
|
||||
if(6)
|
||||
marker = locate(x - 2, y+1,z)
|
||||
if(7)
|
||||
marker = locate(x - 2, y + 2, z)
|
||||
if(8)
|
||||
marker = locate(x - 1, y + 2,z)
|
||||
if(9)
|
||||
marker = locate(x, y + 2,z)
|
||||
if(10)
|
||||
marker = locate(x + 1, y+2,z)
|
||||
if(11)
|
||||
marker = locate(x+ 2, y + 2,z)
|
||||
if(12)
|
||||
marker = locate(x+2,y+1,z)
|
||||
if(13)
|
||||
marker = locate(x+2,y,z)
|
||||
if(14)
|
||||
marker = locate(x+2, y - 1, z)
|
||||
if(15)
|
||||
marker = locate(x+2, y - 2, z)
|
||||
if(16)
|
||||
marker = locate(x+1, y -2, z)
|
||||
|
||||
if(negative)
|
||||
counter--
|
||||
else
|
||||
counter++
|
||||
if(counter > 16)
|
||||
counter = 0
|
||||
if(counter < 0)
|
||||
counter = 16
|
||||
shoot_projectile(marker)
|
||||
sleep(1)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker)
|
||||
var/turf/startloc = get_turf(src)
|
||||
var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
|
||||
playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 100, 1)
|
||||
P.current = startloc
|
||||
P.starting = startloc
|
||||
P.firer = src
|
||||
P.yo = marker.y - startloc.y
|
||||
P.xo = marker.x - startloc.x
|
||||
P.original = marker
|
||||
P.fire()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots()
|
||||
for(var/turf/turf in range(12,get_turf(src)))
|
||||
if(prob(5))
|
||||
shoot_projectile(turf)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast()
|
||||
spawn()
|
||||
for(var/turf/turf in range(1, target))
|
||||
shoot_projectile(turf)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/diagonals()
|
||||
var/turf/T = locate(x + 2, y + 2, z)
|
||||
shoot_projectile(T)
|
||||
T = locate(x + 2, y -2, z)
|
||||
shoot_projectile(T)
|
||||
T = locate(x - 2, y + 2, z)
|
||||
shoot_projectile(T)
|
||||
T = locate(x - 2, y - 2, z)
|
||||
shoot_projectile(T)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/cardinals()
|
||||
var/list/attack_dirs = list(NORTH,EAST,SOUTH,WEST)
|
||||
for(var/d in attack_dirs)
|
||||
var/turf/E = get_edge_target_turf(src, d)
|
||||
shoot_projectile(E)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph()
|
||||
for(var/mob/M in range(10,src))
|
||||
if(M.client)
|
||||
M.client.color = rgb(200, 0, 0)
|
||||
spawn(1)
|
||||
M.client.color = initial(M.client.color)
|
||||
shake_camera(M, 4, 3)
|
||||
playsound(get_turf(src),'sound/magic/clockwork/narsie_attack.ogg', 200, 1)
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/seeking_laser()
|
||||
visible_message("<span class='cult'><font size=5>\"<b>You can't run.</b>\"</font></span>")
|
||||
var/obj/effect/overlay/temp/seeking_beam/B = new(get_turf(src))
|
||||
B.target = target
|
||||
B.firer = src
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam
|
||||
name = "disintegration ball"
|
||||
desc = "Get out of the way!"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "shield-cult"
|
||||
density = 1
|
||||
luminosity = 1
|
||||
var/target
|
||||
var/firer
|
||||
duration = 100
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam/New()
|
||||
..()
|
||||
spawn()
|
||||
while(loc)
|
||||
step_towards(src, target)
|
||||
sleep(1)
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam/process()
|
||||
step_towards(src, target)
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam/Crossed(AM as mob|obj)
|
||||
..()
|
||||
collision(AM)
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam/Bumped(AM as mob|obj)
|
||||
..()
|
||||
collision(AM)
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam/Bump(AM as mob|obj)
|
||||
..()
|
||||
collision(AM)
|
||||
|
||||
/obj/effect/overlay/temp/seeking_beam/proc/collision(AM as mob|obj)
|
||||
if(AM == firer)
|
||||
return
|
||||
if(isliving(AM))
|
||||
var/mob/living/M = AM
|
||||
visible_message("<span class='danger'>[M] is disintegrated by the disintegration ball!</span>")
|
||||
M.dust()
|
||||
else if(istype(AM, /obj/item))
|
||||
var/obj/item/I = AM
|
||||
I.burn()
|
||||
|
||||
/obj/item/projectile/colossus
|
||||
name ="death bolt"
|
||||
icon_state= "chronobolt"
|
||||
damage = 25
|
||||
armour_penetration = 100
|
||||
speed = 2
|
||||
eyeblur = 0
|
||||
damage_type = BRUTE
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
/obj/item/projectile/colossus/on_hit(atom/target, blocked = 0)
|
||||
. = ..()
|
||||
if(istype(target,/turf/)||istype(target,/obj/structure/))
|
||||
target.ex_act(2)
|
||||
|
||||
|
||||
/obj/item/device/gps/internal/colossus
|
||||
icon_state = null
|
||||
gpstag = "Angelic Signal"
|
||||
desc = "Get in the fucking robot."
|
||||
invisibility = 100
|
||||
|
||||
|
||||
|
||||
//Black Box
|
||||
|
||||
/obj/machinery/smartfridge/black_box
|
||||
name = "black box"
|
||||
desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
|
||||
icon = 'icons/obj/lavaland/artefacts.dmi'
|
||||
icon_on = "blackbox"
|
||||
icon_off = "blackbox"
|
||||
luminosity = 8
|
||||
max_n_of_items = 10
|
||||
pixel_y = -4
|
||||
use_power = 0
|
||||
var/duplicate = FALSE
|
||||
var/memory_saved = FALSE
|
||||
var/list/stored_items = list()
|
||||
var/list/blacklist = (/obj/item/weapon/spellbook)
|
||||
|
||||
/obj/machinery/smartfridge/black_box/accept_check(obj/item/O)
|
||||
if(O.type in blacklist)
|
||||
return
|
||||
if(istype(O, /obj/item))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/machinery/smartfridge/black_box/New()
|
||||
..()
|
||||
for(var/obj/machinery/smartfridge/black_box/B in machines)
|
||||
if(B != src)
|
||||
duplicate = 1
|
||||
qdel(src)
|
||||
ReadMemory()
|
||||
|
||||
/obj/machinery/smartfridge/black_box/process()
|
||||
..()
|
||||
if(ticker.current_state == GAME_STATE_FINISHED && !memory_saved)
|
||||
WriteMemory()
|
||||
|
||||
/obj/machinery/smartfridge/black_box/proc/WriteMemory()
|
||||
var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
|
||||
stored_items = list()
|
||||
for(var/obj/I in component_parts)
|
||||
qdel(I)
|
||||
for(var/obj/O in contents)
|
||||
stored_items += O.type
|
||||
S["stored_items"] << stored_items
|
||||
memory_saved = TRUE
|
||||
|
||||
/obj/machinery/smartfridge/black_box/proc/ReadMemory()
|
||||
var/savefile/S = new /savefile("data/npc_saves/Blackbox.sav")
|
||||
S["stored_items"] >> stored_items
|
||||
|
||||
if(isnull(stored_items))
|
||||
stored_items = list()
|
||||
|
||||
for(var/item in stored_items)
|
||||
new item(src)
|
||||
|
||||
|
||||
/obj/machinery/smartfridge/black_box/Destroy()
|
||||
if(duplicate)
|
||||
return ..()
|
||||
else
|
||||
return QDEL_HINT_LETMELIVE
|
||||
|
||||
|
||||
//No taking it apart
|
||||
|
||||
/obj/machinery/smartfridge/black_box/default_deconstruction_screwdriver()
|
||||
return
|
||||
|
||||
/obj/machinery/smartfridge/black_box/exchange_parts()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/smartfridge/black_box/default_pry_open()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/smartfridge/black_box/default_unfasten_wrench()
|
||||
return
|
||||
|
||||
/obj/machinery/smartfridge/black_box/default_deconstruction_crowbar()
|
||||
return
|
||||
@@ -59,7 +59,7 @@
|
||||
src.visible_message(
|
||||
"<span class='danger'>[src] devours [L]!</span>",
|
||||
"<span class='userdanger'>You feast on [L], restoring your health!</span>")
|
||||
adjustBruteLoss(-L.maxHealth)
|
||||
adjustBruteLoss(-L.maxHealth/2)
|
||||
L.gib()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/Process_Spacemove(movement_dir = 0)
|
||||
@@ -224,8 +224,8 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/dragon/lesser
|
||||
name = "lesser ash drake"
|
||||
maxHealth = 750
|
||||
health = 750
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
melee_damage_upper = 30
|
||||
melee_damage_lower = 30
|
||||
damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
|
||||
Reference in New Issue
Block a user