Bubblegum

This commit is contained in:
KorPhaeron
2016-06-07 03:43:20 -05:00
parent de89461058
commit 39bdefd9e6
8 changed files with 633 additions and 7 deletions
@@ -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)
+1 -1
View File
@@ -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 = 1, /mob/living/simple_animal/hostile/megafauna/bubblegum = 0.5, /mob/living/simple_animal/hostile/megafauna/bubblegum = 0.5)
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
initial_gas_mix = "o2=14;n2=23;TEMP=300"
@@ -0,0 +1,167 @@
/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 = 30
melee_damage_upper = 30
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/dragon)
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()
..()
/* if(!charging)
blood_warp()*/
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()
// if(blood_warp_cooldown > world.time)
// return
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,367 @@
/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()
/obj/machinery/smartfridge/black_box/accept_check(obj/item/O)
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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

+2
View File
@@ -1456,6 +1456,8 @@
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#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\megafauna\bubblegum.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.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"