mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 15:17:01 +01:00
Side antagonist tweaks
This commit is contained in:
@@ -35,7 +35,7 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
var/turf/mobloc = get_turf(src.loc)
|
||||
src.notransform = TRUE
|
||||
spawn(0)
|
||||
src.visible_message("[src] sinks into the pool of blood.")
|
||||
src.visible_message("<span class='warning'>[src] sinks into the pool of blood!</span>")
|
||||
playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, 1, -1)
|
||||
var/obj/effect/dummy/slaughter/holder = PoolOrNew(/obj/effect/dummy/slaughter,mobloc)
|
||||
src.ExtinguishMob()
|
||||
@@ -45,41 +45,50 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
if(istype(src.pulling, /mob/living))
|
||||
var/mob/living/victim = src.pulling
|
||||
if(victim.stat == CONSCIOUS)
|
||||
src.visible_message("[victim] kicks free of the [src] at the last second!")
|
||||
src.visible_message("<span class='warning'>[victim] kicks free of the blood pool just before entering it!</span>")
|
||||
else
|
||||
victim.loc = holder
|
||||
src.visible_message("<span class='warning'><B>The [src] drags [victim] into the pool of blood!</B>")
|
||||
victim.emote("scream")
|
||||
src.visible_message("<span class='warning'><b>[src] drags [victim] into the pool of blood!</b></span>")
|
||||
kidnapped = victim
|
||||
src.loc = holder
|
||||
src.holder = holder
|
||||
if(kidnapped)
|
||||
src << "<B>You begin to feast on [kidnapped]. You can not move while you are doing this.</B>"
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
src << "<span class='danger'>You begin to feast on [kidnapped]. You can not move while you are doing this.</span>"
|
||||
for(var/i = 3; i > 0; i--)
|
||||
playsound(get_turf(src),'sound/magic/Demon_consume.ogg', 100, 1)
|
||||
sleep(30)
|
||||
if(kidnapped)
|
||||
src << "<B>You devour [kidnapped]. Your health is fully restored.</B>"
|
||||
src << "<span class='danger'>You devour [kidnapped]. Your health is fully restored.</span>"
|
||||
src.adjustBruteLoss(-1000)
|
||||
src.adjustFireLoss(-1000)
|
||||
src.adjustOxyLoss(-1000)
|
||||
src.adjustToxLoss(-1000)
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
if(istype(src, /mob/living/simple_animal/slaughter))
|
||||
var/mob/living/simple_animal/slaughter/S = src
|
||||
kidnapped << "<span class='userdanger'>You feel teeth sink into your flesh, and the--</span>"
|
||||
kidnapped.adjustBruteLoss(1000)
|
||||
kidnapped.loc = src
|
||||
S.consumed_mobs.Add(kidnapped)
|
||||
else
|
||||
kidnapped.ghostize()
|
||||
qdel(kidnapped)
|
||||
else
|
||||
src << "<B>You happily devour...nothing? Your meal vanished at some point!</B>"
|
||||
src << "<span class='danger'>You happily devour... nothing? Your meal vanished at some point!</span>"
|
||||
src.notransform = 0
|
||||
|
||||
/mob/living/proc/phasein(obj/effect/decal/cleanable/B)
|
||||
if(src.notransform)
|
||||
src << "<B>Finish eating first!</B>"
|
||||
src << "<span class='warning'>Finish eating first!</span>"
|
||||
return 0
|
||||
|
||||
B.visible_message("<span class='warning'>[B] starts to bubble...</span>")
|
||||
if(!do_after(src, 20, target = B))
|
||||
return
|
||||
if(!B)
|
||||
return
|
||||
src.loc = B.loc
|
||||
src.client.eye = src
|
||||
src.visible_message("<span class='warning'><B>The [src] rises out of the pool of blood!</B>")
|
||||
src.visible_message("<span class='warning'><B>[src] rises out of the pool of blood!</B>")
|
||||
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
|
||||
qdel(src.holder)
|
||||
src.holder = null
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#define MORPH_COOLDOWN 50
|
||||
|
||||
/mob/living/simple_animal/hostile/morph
|
||||
name = "Morph"
|
||||
real_name = "Morph"
|
||||
desc = "some amorphous blob"
|
||||
name = "morph"
|
||||
real_name = "morph"
|
||||
desc = "A revolting, pulsating pile of flesh."
|
||||
speak_emote = list("gurgles")
|
||||
emote_hear = list("gurgles")
|
||||
icon = 'icons/mob/animal.dmi'
|
||||
@@ -28,16 +28,25 @@
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
idle_vision_range = 1 // Only attack when target is close
|
||||
wander = 0
|
||||
attacktext = "glomps"
|
||||
attack_sound = 'sound/effects/blobattack.ogg'
|
||||
|
||||
var/morphed = 0
|
||||
var/atom/movable/form = null
|
||||
var/morph_time = 0
|
||||
|
||||
var/playstyle_string = "<b><font size=3 color='red'>You are a morph,</font> an abomination of science created primarily with changeling cells. \
|
||||
You may take the form of anything nearby by middle-clicking it. This process will alert any nearby \
|
||||
observers, and can only be performed once every five seconds. While morphed, you move faster, but do \
|
||||
less damage. In addition, anyone within three tiles will note an uncanny wrongness if examining you. \
|
||||
You can attack any item or dead creature to consume it - creatures will fully restore your health. \
|
||||
Finally, you can restore yourself to your original form while morphed by middle-clicking yourself.</b>"
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/examine(mob/user)
|
||||
if(morphed)
|
||||
form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it
|
||||
if(get_dist(user,src)<=3)
|
||||
user << "<span class='notice'>Looks odd!</span>"
|
||||
user << "<span class='warning'>It doesn't look quite right...</span>"
|
||||
else
|
||||
..()
|
||||
return
|
||||
@@ -57,6 +66,7 @@
|
||||
if(istype(A) && allowed(A))
|
||||
assume(A)
|
||||
else
|
||||
src << "<span class='warning'>Your chameleon skin is still repairing itself!</span>"
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/proc/assume(atom/movable/target)
|
||||
@@ -72,11 +82,15 @@
|
||||
else
|
||||
overlays = target.overlays.Copy()
|
||||
|
||||
visible_message("<span class='warning'>[src] suddenly twists and changes shape, becoming a copy of [target]!</span>", \
|
||||
"<span class='notice'>You twist your body and assume the form of [target].</span>")
|
||||
|
||||
name = target.name
|
||||
icon = target.icon
|
||||
icon_state = target.icon_state
|
||||
overlays = target.overlays
|
||||
|
||||
|
||||
//Morphed is weaker
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
@@ -93,6 +107,8 @@
|
||||
|
||||
//anim(loc,src,'icons/mob/mob.dmi',,"morph",,src.dir)
|
||||
|
||||
visible_message("<span class='warning'>[src] suddenly collapses in on itself, dissolving into a pile of green flesh!</span>", \
|
||||
"<span class='notice'>You reform to your normal body.</span>")
|
||||
name = initial(name)
|
||||
icon = initial(icon)
|
||||
icon_state = initial(icon_state)
|
||||
@@ -108,7 +124,8 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/morph/death()
|
||||
if(morphed)
|
||||
visible_message("<span class='danger'>The [src] dissolves!</span>")
|
||||
visible_message("<span class='warning'>[src] twists and dissolves into a pile of green flesh!</span>", \
|
||||
"<span class='userdanger'>Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--</span>")
|
||||
restore()
|
||||
|
||||
//Dump eaten stuff
|
||||
@@ -148,7 +165,7 @@
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
if(do_after(src, 30, target = L))
|
||||
visible_message("<span class='warning'>[src] swallows the [target] whole!</span>")
|
||||
visible_message("<span class='warning'>[src] swallows [target] whole!</span>")
|
||||
L.loc = src
|
||||
adjustBruteLoss(-50)
|
||||
return
|
||||
@@ -156,7 +173,7 @@
|
||||
var/obj/item/I = target
|
||||
if(!I.anchored)
|
||||
if(do_after(src,20, target = I))
|
||||
visible_message("<span class='warning'>[src] swallows the [target] whole!</span>")
|
||||
visible_message("<span class='warning'>[src] swallows [target] whole!</span>")
|
||||
I.loc = src
|
||||
return
|
||||
target.attack_animal(src)
|
||||
@@ -198,15 +215,10 @@
|
||||
player_mind.assigned_role = "Morph"
|
||||
player_mind.special_role = "Morph"
|
||||
ticker.mode.traitors |= player_mind
|
||||
var/info = {"<B>You are a Morph, a shapeshifting alien creature.</B>
|
||||
You can assume the shape of anything in sight by Shift-Clicking it.
|
||||
You can only transform every 5 seconds.
|
||||
To return to your basic form Shift-Click on yourself.
|
||||
Base form is slow but strong, you're much weaker and faster when disguised.
|
||||
You can eat items and corpses by clicking on them,eating corpses will heal you."}
|
||||
S << info
|
||||
message_admins("[key_of_morph] has been made into Morph by an event.")
|
||||
log_game("[key_of_morph] was spawned as a Morph by an event.")
|
||||
S << S.playstyle_string
|
||||
S << 'sound/magic/Mutate.ogg'
|
||||
message_admins("[key_of_morph] has been made into morph by an event.")
|
||||
log_game("[key_of_morph] was spawned as a morph by an event.")
|
||||
return 1
|
||||
|
||||
/datum/round_event/morph/start()
|
||||
@@ -214,11 +226,11 @@
|
||||
|
||||
|
||||
/datum/round_event/morph/proc/find_morph()
|
||||
message_admins("Attempted to spawn a Morph but there was no players available. Will try again momentarily.")
|
||||
message_admins("Attempted to spawn a morph but there was no players available. Will try again momentarily.")
|
||||
spawn(50)
|
||||
if(get_morph(1))
|
||||
message_admins("Situation has been resolved, [key_of_morph] has been spawned as a Morph.")
|
||||
log_game("[key_of_morph] was spawned as a Morph by an event.")
|
||||
message_admins("Situation has been resolved, [key_of_morph] has been spawned as a morph.")
|
||||
log_game("[key_of_morph] was spawned as a morph by an event.")
|
||||
return 0
|
||||
message_admins("Unfortunately, no candidates were available for becoming a Morph. Shutting down.")
|
||||
message_admins("Unfortunately, no candidates were available for becoming a morph. Shutting down.")
|
||||
return kill()
|
||||
@@ -1,9 +1,9 @@
|
||||
//////////////////The Monster
|
||||
|
||||
/mob/living/simple_animal/slaughter
|
||||
name = "Slaughter Demon"
|
||||
real_name = "Slaughter Demon"
|
||||
desc = "You should run."
|
||||
name = "slaughter demon"
|
||||
real_name = "slaughter demon"
|
||||
desc = "A large, menacing creature covered in armored black scales."
|
||||
speak_emote = list("gurgles")
|
||||
emote_hear = list("wails","screeches")
|
||||
response_help = "thinks better of touching"
|
||||
@@ -31,10 +31,11 @@
|
||||
var/boost = 0
|
||||
bloodcrawl = BLOODCRAWL_EAT
|
||||
see_invisible = SEE_INVISIBLE_MINIMUM
|
||||
var/playstyle_string = "<B>You are the Slaughter Demon, a terible creature from another existence. You have a single desire: To kill. \
|
||||
You may Ctrl+Click on blood pools to travel through them, appearing and dissaapearing from the station at will. \
|
||||
Pulling a dead or critical mob while you enter a pool will pull them in with you, allowing you to feast. \
|
||||
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
|
||||
var/list/consumed_mobs = list()
|
||||
var/playstyle_string = "<B><font size=3 color='red'>You are a slaughter demon,</font> a terrible creature from another realm. You have a single desire: To kill. \
|
||||
You may use the \"Blood Crawl\" ability near blood pools to travel through them, appearing and dissaapearing from the station at will. \
|
||||
Pulling a dead or unconscious mob while you enter a pool will pull them in with you, allowing you to feast and regain your health. \
|
||||
You move quickly upon leaving a pool of blood, but the material world will soon sap your strength and leave you sluggish. </B>"
|
||||
|
||||
/mob/living/simple_animal/slaughter/New()
|
||||
..()
|
||||
@@ -52,10 +53,17 @@
|
||||
|
||||
/mob/living/simple_animal/slaughter/death()
|
||||
..(1)
|
||||
new /obj/effect/decal/cleanable/blood (src.loc)
|
||||
new /obj/item/weapon/demonheart (src.loc)
|
||||
new /obj/effect/decal/cleanable/blood (get_turf(src))
|
||||
var/obj/effect/decal/cleanable/blood/innards = new (get_turf(src))
|
||||
innards.icon = 'icons/obj/surgery.dmi'
|
||||
innards.icon_state = "innards"
|
||||
innards.name = "pile of viscera"
|
||||
innards.desc = "A repulsive pile of guts and gore."
|
||||
new /obj/item/organ/internal/heart/demon (src.loc)
|
||||
playsound(get_turf(src),'sound/magic/demon_dies.ogg', 200, 1)
|
||||
visible_message("<span class='danger'>The [src] screams in anger as its form collapes into a pool of viscera.</span>")
|
||||
visible_message("<span class='danger'>[src] screams in anger as it collapses into a puddle of viscera, its most recent meals spilling out of it.</span>")
|
||||
for(var/mob/living/M in consumed_mobs)
|
||||
M.loc = get_turf(src)
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
@@ -67,23 +75,28 @@
|
||||
boost = world.time + 30
|
||||
|
||||
|
||||
//////////The Loot
|
||||
|
||||
/obj/item/weapon/demonheart
|
||||
name = "demon's heart"
|
||||
desc = "It's still faintly beating with rage"
|
||||
//The loot from killing a slaughter demon - can be consumed to allow the user to blood crawl
|
||||
/obj/item/organ/internal/heart/demon
|
||||
name = "demon heart"
|
||||
desc = "Still it beats furiously, emanating an aura of utter hate."
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
icon_state = "heart-on"
|
||||
icon_state = "demon_heart"
|
||||
origin_tech = "combat=5;biotech=8"
|
||||
beating = 1 //What did you expect?
|
||||
|
||||
/obj/item/weapon/demonheart/attack_self(mob/living/user)
|
||||
visible_message("[user] feasts upon the [src].")
|
||||
/obj/item/organ/internal/heart/demon/attack(mob/M, mob/living/user, obj/target)
|
||||
if(M != user)
|
||||
return ..()
|
||||
user.visible_message("<span class='warning'>[user] raises [src] to their mouth and tears into it with their teeth!</span>", \
|
||||
"<span class='danger'>An unnatural hunger consumes you. You raise [src] your mouth and devour it!</span>")
|
||||
playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1)
|
||||
for(var/obj/effect/proc_holder/spell/knownspell in user.mind.spell_list)
|
||||
if(knownspell.type == /obj/effect/proc_holder/spell/bloodcrawl)
|
||||
user <<"<span class='notice'>You already know how to blood crawl.</span>"
|
||||
user <<"<span class='warning'>...and you don't feel any different.</span>"
|
||||
qdel(src)
|
||||
return
|
||||
user << "You absorb some of the demon's power!"
|
||||
user.visible_message("<span class='warning'>[user]'s eyes flare a deep crimson!</span>", \
|
||||
"<span class='userdanger'>You feel a strange power seep into your body... you have absorbed the demon's blood-travelling powers!</span>")
|
||||
user.mind.AddSpell(new /obj/effect/proc_holder/spell/bloodcrawl)
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
|
||||
@@ -44,9 +44,10 @@
|
||||
player_mind.special_role = "Slaughter Demon"
|
||||
ticker.mode.traitors |= player_mind
|
||||
S << S.playstyle_string
|
||||
S << "<B>You are currently not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.</B>"
|
||||
message_admins("[key_of_slaughter] has been made into a Slaughter Demon by an event.")
|
||||
log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
|
||||
S << "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>"
|
||||
S << 'sound/magic/demon_dies.ogg'
|
||||
message_admins("[key_of_slaughter] has been made into a slaughter demon by an event.")
|
||||
log_game("[key_of_slaughter] was spawned as a slaughter demon by an event.")
|
||||
return 1
|
||||
|
||||
|
||||
@@ -57,11 +58,11 @@
|
||||
|
||||
|
||||
/datum/round_event/slaughter/proc/find_slaughter()
|
||||
message_admins("Attempted to spawn a Slaughter Demon but there was no players available. Will try again momentarily.")
|
||||
message_admins("Attempted to spawn a slaughter demon but there was no players available. Will try again momentarily.")
|
||||
spawn(50)
|
||||
if(get_slaughter(1))
|
||||
message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a Slaughter Demon.")
|
||||
log_game("[key_of_slaughter] was spawned as a Slaughter Demon by an event.")
|
||||
message_admins("Situation has been resolved, [key_of_slaughter] has been spawned as a slaughter demon.")
|
||||
log_game("[key_of_slaughter] was spawned as a slaughter demon by an event.")
|
||||
return 0
|
||||
message_admins("Unfortunately, no candidates were available for becoming a Slaugter Demon. Shutting down.")
|
||||
message_admins("Unfortunately, no candidates were available for becoming a slaughter demon. Shutting down.")
|
||||
return kill()
|
||||
|
||||
Reference in New Issue
Block a user