Adds changeling horror form (#2819)

Adds an end game power for changelings (15 genomes points), allowing them to turn into a robust mob for around five minutes.

Fixes some issues with arm blades and shields, also adds a chem costs to using them.

Adds new changeling related sounds.
This commit is contained in:
Alberyk
2017-06-28 08:23:49 -03:00
committed by skull132
parent 300f238111
commit 013a361ca3
15 changed files with 238 additions and 9 deletions
+1
View File
@@ -1620,6 +1620,7 @@
#include "code\modules\mob\living\simple_animal\hostile\bat.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
#include "code\modules\mob\living\simple_animal\hostile\carp.dm"
#include "code\modules\mob\living\simple_animal\hostile\changeling.dm"
#include "code\modules\mob\living\simple_animal\hostile\creature.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
+3 -1
View File
@@ -10,6 +10,8 @@
welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
antaghud_indicator = "hudchangeling"
faction = "Changeling"
/datum/antagonist/changeling/get_special_objective_text(var/datum/mind/player)
return "<br><b>Changeling ID:</b> [player.changeling.changelingID].<br><b>Genomes Absorbed:</b> [player.changeling.absorbedcount]"
@@ -73,4 +75,4 @@
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic.
return 0
return 1
return 0
return 0
@@ -25,7 +25,7 @@
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/item/weapon/melee/arm_blade/dropped()
/obj/item/weapon/melee/arm_blade/dropped(var/mob/living/user)
visible_message("<span class='danger'>With a sickening crunch, [user] reforms their arm blade into an arm!</span>",
"<span class='warning'>You hear organic matter ripping and tearing!</span>")
playsound(loc, 'sound/effects/blobattack.ogg', 30, 1)
@@ -69,8 +69,8 @@
STOP_PROCESSING(SSprocessing, src)
return ..()
/obj/item/weapon/shield/riot/changeling/dropped()
visible_message("<span class='danger'>With a sickening crunch, [user] reforms their arm blade into an arm!</span>",
/obj/item/weapon/shield/riot/changeling/dropped(var/mob/living/user)
visible_message("<span class='danger'>With a sickening crunch, [user] reforms their shield into an arm!</span>",
"<span class='warning'>You hear organic matter ripping and tearing!</span>")
playsound(loc, 'sound/effects/blobattack.ogg', 30, 1)
QDEL_IN(src, 1)
@@ -89,3 +89,14 @@
host.embedded -= src
host.drop_from_inventory(src)
QDEL_IN(src, 1)
/obj/item/weapon/bone_dart
name = "bone dart"
desc = "A sharp piece of bone shapped as small dart."
icon = 'icons/obj/changeling.dmi'
icon_state = "bone_dart"
item_state = "bolt"
sharp = 1
edge = 0
throwforce = 5
w_class = 2
@@ -184,10 +184,12 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(2)
src << "<span class='notice'>We extend a proboscis.</span>"
src.visible_message("<span class='warning'>[src] extends a proboscis!</span>")
playsound(get_turf(src), 'sound/effects/lingextends.ogg', 50, 1)
if(3)
src << "<span class='notice'>We stab [T] with the proboscis.</span>"
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
playsound(get_turf(src), 'sound/effects/lingstabs.ogg', 50, 1)
var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
if(affecting.take_damage(39,0,1,0,"large organic needle"))
T:UpdateDamageIcon()
@@ -201,6 +203,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
src << "<span class='notice'>We have absorbed [T]!</span>"
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
playsound(get_turf(src), 'sound/effects/lingabsorbs.ogg', 50, 1)
changeling.chem_charges += 10
changeling.geneticpoints += 2
@@ -853,9 +856,13 @@ var/list/datum/absorbed_dna/hivemind_bank = list()
/mob/proc/armblades()
set category = "Changeling"
set name = "Form Blades"
set name = "Form Blades (20)"
set desc="Rupture the flesh and mend the bone of your hand into a deadly blade."
var/datum/changeling/changeling = changeling_power(20,0,0)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 20
var/mob/living/M = src
if(M.l_hand && M.r_hand)
@@ -865,7 +872,7 @@ var/list/datum/absorbed_dna/hivemind_bank = list()
var/obj/item/weapon/melee/arm_blade/blade = new(M)
blade.creator = M
M.put_in_hands(blade)
playsound(loc, 'sound/effects/blobattack.ogg', 30, 1)
playsound(loc, 'sound/weapons/bloodyslice.ogg', 30, 1)
src.visible_message("<span class='danger'>A grotesque blade forms around [M]\'s arm!</span>",
"<span class='danger'>Our arm twists and mutates, transforming it into a deadly blade.</span>",
"<span class='danger'>You hear organic matter ripping and tearing!</span>")
@@ -873,9 +880,13 @@ var/list/datum/absorbed_dna/hivemind_bank = list()
/mob/proc/changeling_shield()
set category = "Changeling"
set name = "Form Shield"
set name = "Form Shield (20)"
set desc="Bend the flesh and bone of your hand into a grotesque shield."
var/datum/changeling/changeling = changeling_power(20,0,0)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 20
var/mob/living/M = src
if(M.l_hand && M.r_hand)
@@ -886,11 +897,67 @@ var/list/datum/absorbed_dna/hivemind_bank = list()
shield.creator = M
M.put_in_hands(shield)
playsound(loc, 'sound/effects/blobattack.ogg', 30, 1)
src.visible_message("<span class='warning'>The end of [M]\'s hand inflates rapidly, forming a huge shield-like mass!</span>",
src.visible_message("<span class='danger'>The end of [M]\'s hand inflates rapidly, forming a huge shield-like mass!</span>",
"<span class='warning'>We inflate our hand into a robust shield.</span>",
"<span class='warning'>You hear organic matter ripping and tearing!</span>")
gibs(src.loc)
/mob/proc/horror_form()
set category = "Changeling"
set name = "Horror Form (40)"
set desc = "Tear apart your human disguise, revealing your true form."
var/datum/changeling/changeling = changeling_power(40,0,0)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 40
var/mob/living/M = src
M.visible_message("<span class='danger'>[M] writhes and contorts, their body expanding to inhuman proportions!</span>", \
"<span class='danger'>We begin our transformation to our true form!</span>")
if(!do_after(src,60))
M.visible_message("<span class='danger'>[M]'s transformation abruptly reverts itself!</span>", \
"<span class='danger'>Our transformation has been interrupted!</span>")
return 0
M.visible_message("<span class='danger'>[M] grows into an abomination and lets out an awful scream!</span>")
playsound(loc, 'sound/effects/greaterling.ogg', 100, 1)
var/mob/living/simple_animal/hostile/true_changeling/ling = new (get_turf(M))
if(istype(M,/mob/living/carbon/human))
for(var/obj/item/I in M.contents)
if(isorgan(I))
continue
M.drop_from_inventory(I)
if(M.mind)
M.mind.transfer_to(ling)
else
ling.key = M.key
var/atom/movable/overlay/effect = new /atom/movable/overlay(get_turf(M))
effect.density = 0
effect.anchored = 1
effect.icon = 'icons/effects/effects.dmi'
effect.layer = 3
flick("summoning",effect)
QDEL_IN(effect, 10)
M.forceMove(ling) //move inside the new dude to hide him.
M.status_flags |= GODMODE //dont want him to die or breathe or do ANYTHING
addtimer(CALLBACK(src, .proc/revert_horror_form,ling), 10 MINUTES)
/mob/proc/revert_horror_form(var/mob/living/ling)
if(QDELETED(ling))
return
src.status_flags &= ~GODMODE //no more godmode.
if(ling.mind)
ling.mind.transfer_to(src)
else
src.key = ling.key
playsound(get_turf(src),'sound/effects/blobattack.ogg',50,1)
src.forceMove(get_turf(ling))
qdel(ling)
//dna related datum
/datum/absorbed_dna
@@ -192,6 +192,12 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 3
verbpath = /mob/proc/changeling_shield
/datum/power/changeling/horror_form
name = "Horror Form"
desc = "We tear apart our human disguise, revealing our true form."
genomecost = 15
verbpath = /mob/proc/horror_form
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
set category = "Changeling"
@@ -0,0 +1,133 @@
/mob/living/simple_animal/hostile/true_changeling
name = "shambling horror"
desc = "A monstrous creature, made of twisted flesh and bone."
speak_emote = list("gibbers")
icon = 'icons/mob/animal.dmi'
icon_state = "horror"
icon_living = "horror"
icon_dead = "horror_dead"
stop_automated_movement = 1
universal_speak =1
universal_understand = 1
mob_swap_flags = HUMAN|SIMPLE_ANIMAL|SLIME|MONKEY
mob_push_flags = ALLMOBS
response_help = "pets"
response_disarm = "shoves"
response_harm = "harmlessly punches"
maxHealth = 750
health = 750
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 30
mob_size = 25
environment_smash = 2
attacktext = "mangled"
attack_sound = 'sound/weapons/bloodyslice.ogg'
see_in_dark = 8
see_invisible = SEE_INVISIBLE_NOLIGHTING
minbodytemp = 0
maxbodytemp = 350
min_oxy = 0
max_co2 = 0
max_tox = 0
var/is_devouring = FALSE
/mob/living/simple_animal/hostile/true_changeling/Initialize()
. = ..()
if(prob(25))
icon_state = "horror_alt"
icon_living = "horror_alt"
/mob/living/simple_animal/hostile/true_changeling/Life()
..()
adjustBruteLoss(-10) //it will slowly heal brute damage, making fire/laser a stronger option
/mob/living/simple_animal/hostile/true_changeling/mind_initialize()
..()
mind.assigned_role = "Changeling"
/mob/living/simple_animal/hostile/true_changeling/death(gibbed)
..()
if(!gibbed)
visible_message("<b>[src]</b> lets out a waning scream as it falls, twitching, to the floor!")
playsound(loc, 'sound/effects/creepyshriek.ogg', 30, 1)
gibs(src.loc)
qdel(src)
return
/mob/living/simple_animal/hostile/true_changeling/verb/ling_devour(mob/living/target as mob in oview())
set category = "Changeling"
set name = "Devour"
set desc = "Devours a creature, destroying its body and regenerating health."
if(!Adjacent(target))
return
if(target.isSynthetic())
return
if(src.is_devouring)
src << "<span class='warning'>We are already feasting on something!</span>"
return 0
if(!health)
src << "<span class='notice'>We are dead, we cannot use any abilities!</span>"
return
if(last_special > world.time)
src << "<span class='warning'>We must wait a little while before we can use this ability again!</span>"
return
src.visible_message("<span class='warning'>[src] begins ripping apart and feasting on [target]!</span>")
src.is_devouring = TRUE
target.adjustBruteLoss(35)
if(!do_after(src,150))
src<< "<span class='warning'>You need to wait longer to devour \the [target]!</span>"
src.is_devouring = FALSE
return 0
src.visible_message("<span class='warning'>[src] tears a chunk from \the [target]'s flesh!</span>")
target.adjustBruteLoss(35)
if(!do_after(src,150))
src<< "<span class='warning'>You need to wait longer to devour \the [target]!</span>"
src.is_devouring = FALSE
return 0
src.visible_message("<span class='warning'>[target] is completely devoured by [src]!</span>", \
"<span class='danger'>You completely devour \the [target]!</span>")
target.gib()
rejuvenate()
updatehealth()
last_special = world.time + 100
src.is_devouring = FALSE
return
/mob/living/simple_animal/hostile/true_changeling/verb/dart(mob/living/target as mob in oview())
set name = "Launch Bone Dart"
set desc = "Launches a Bone Dart at a target."
set category = "Changeling"
if(!health)
usr << "<span class='notice'>We are dead, we cannot use any abilities!</span>"
return
if(last_special > world.time)
return
last_special = world.time + 30
visible_message("<span class='warning'>\The [src]'s skin bulges and tears, launching a bone-dart at [target]!</span>")
playsound(src.loc, 'sound/weapons/bloodyslice.ogg', 50, 1)
var/obj/item/weapon/bone_dart/A = new /obj/item/weapon/bone_dart(usr.loc)
A.throw_at(target, 10, 20, user)
add_logs(src, target, "launched a bone dart at")
+3 -1
View File
@@ -1082,13 +1082,15 @@
/mob/living/simple_animal/hostile/syndicate/ranged/space,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/faithless,
/mob/living/simple_animal/hostile/faithless/wizard,
/mob/living/simple_animal/hostile/retaliate,
/mob/living/simple_animal/hostile/retaliate/clown,
/mob/living/simple_animal/hostile/alien,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/simple_animal/hostile/alien/sentinel,
/mob/living/simple_animal/hostile/alien/queen,
/mob/living/simple_animal/hostile/alien/queen/large
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/true_changeling
)//exclusion list for things you don't want the reaction to create.
var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+7
View File
@@ -0,0 +1,7 @@
author: Alberyk
delete-after: True
changes:
- rscadd: "Added a new changeling power, horror form."
- soundadd: "Added new changeling related sounds."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 203 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.