diff --git a/baystation12.dme b/baystation12.dme
index 9b459742ed2..c7452e26f4c 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -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"
diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm
index 462460b06f8..f8843e839f2 100644
--- a/code/game/antagonist/station/changeling.dm
+++ b/code/game/antagonist/station/changeling.dm
@@ -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 "
Changeling ID: [player.changeling.changelingID].
Genomes Absorbed: [player.changeling.absorbedcount]"
@@ -73,4 +75,4 @@
if(player.current.client.prefs.organ_data["torso"] == "cyborg") // Full synthetic.
return 0
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/gamemodes/changeling/changeling_items.dm b/code/game/gamemodes/changeling/changeling_items.dm
index 6436db77c22..0cbbb9446d4 100644
--- a/code/game/gamemodes/changeling/changeling_items.dm
+++ b/code/game/gamemodes/changeling/changeling_items.dm
@@ -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("With a sickening crunch, [user] reforms their arm blade into an arm!",
"You hear organic matter ripping and tearing!")
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("With a sickening crunch, [user] reforms their arm blade into an arm!",
+/obj/item/weapon/shield/riot/changeling/dropped(var/mob/living/user)
+ visible_message("With a sickening crunch, [user] reforms their shield into an arm!",
"You hear organic matter ripping and tearing!")
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
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 5ce2f3af20d..93b355de1e5 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -184,10 +184,12 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(2)
src << "We extend a proboscis."
src.visible_message("[src] extends a proboscis!")
+ playsound(get_turf(src), 'sound/effects/lingextends.ogg', 50, 1)
if(3)
src << "We stab [T] with the proboscis."
src.visible_message("[src] stabs [T] with the proboscis!")
T << "You feel a sharp stabbing pain!"
+ 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 << "We have absorbed [T]!"
src.visible_message("[src] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
+ 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("A grotesque blade forms around [M]\'s arm!",
"Our arm twists and mutates, transforming it into a deadly blade.",
"You hear organic matter ripping and tearing!")
@@ -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("The end of [M]\'s hand inflates rapidly, forming a huge shield-like mass!",
+ src.visible_message("The end of [M]\'s hand inflates rapidly, forming a huge shield-like mass!",
"We inflate our hand into a robust shield.",
"You hear organic matter ripping and tearing!")
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("[M] writhes and contorts, their body expanding to inhuman proportions!", \
+ "We begin our transformation to our true form!")
+ if(!do_after(src,60))
+ M.visible_message("[M]'s transformation abruptly reverts itself!", \
+ "Our transformation has been interrupted!")
+ return 0
+
+ M.visible_message("[M] grows into an abomination and lets out an awful scream!")
+ 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
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 303016281a2..985664e256b 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -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"
diff --git a/code/modules/mob/living/simple_animal/hostile/changeling.dm b/code/modules/mob/living/simple_animal/hostile/changeling.dm
new file mode 100644
index 00000000000..e901c1bc9fe
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/changeling.dm
@@ -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("[src] 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 << "We are already feasting on something!"
+ return 0
+
+ if(!health)
+ src << "We are dead, we cannot use any abilities!"
+ return
+
+ if(last_special > world.time)
+ src << "We must wait a little while before we can use this ability again!"
+ return
+
+ src.visible_message("[src] begins ripping apart and feasting on [target]!")
+ src.is_devouring = TRUE
+
+ target.adjustBruteLoss(35)
+
+ if(!do_after(src,150))
+ src<< "You need to wait longer to devour \the [target]!"
+ src.is_devouring = FALSE
+ return 0
+
+ src.visible_message("[src] tears a chunk from \the [target]'s flesh!")
+
+ target.adjustBruteLoss(35)
+
+ if(!do_after(src,150))
+ src<< "You need to wait longer to devour \the [target]!"
+ src.is_devouring = FALSE
+ return 0
+
+ src.visible_message("[target] is completely devoured by [src]!", \
+ "You completely devour \the [target]!")
+ 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 << "We are dead, we cannot use any abilities!"
+ return
+
+ if(last_special > world.time)
+ return
+
+ last_special = world.time + 30
+
+ visible_message("\The [src]'s skin bulges and tears, launching a bone-dart at [target]!")
+
+ 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")
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 46cce2047d0..05c0bc7f910 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -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)
diff --git a/html/changelogs/alberky-PR-2819.yml b/html/changelogs/alberky-PR-2819.yml
new file mode 100644
index 00000000000..7895320e571
--- /dev/null
+++ b/html/changelogs/alberky-PR-2819.yml
@@ -0,0 +1,7 @@
+author: Alberyk
+
+delete-after: True
+
+changes:
+ - rscadd: "Added a new changeling power, horror form."
+ - soundadd: "Added new changeling related sounds."
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 825cc125f01..03a9239ad54 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/obj/changeling.dmi b/icons/obj/changeling.dmi
index 15f0e3a9475..25332f32995 100644
Binary files a/icons/obj/changeling.dmi and b/icons/obj/changeling.dmi differ
diff --git a/sound/effects/greaterling.ogg b/sound/effects/greaterling.ogg
new file mode 100644
index 00000000000..7654ab0996d
Binary files /dev/null and b/sound/effects/greaterling.ogg differ
diff --git a/sound/effects/lingabsorbs.ogg b/sound/effects/lingabsorbs.ogg
new file mode 100644
index 00000000000..1c47e9c2a91
Binary files /dev/null and b/sound/effects/lingabsorbs.ogg differ
diff --git a/sound/effects/lingextends.ogg b/sound/effects/lingextends.ogg
new file mode 100644
index 00000000000..ec0b2a5ec09
Binary files /dev/null and b/sound/effects/lingextends.ogg differ
diff --git a/sound/effects/lingstabs.ogg b/sound/effects/lingstabs.ogg
new file mode 100644
index 00000000000..85bd7d7b013
Binary files /dev/null and b/sound/effects/lingstabs.ogg differ
diff --git a/sound/weapons/bloodyslice.ogg b/sound/weapons/bloodyslice.ogg
new file mode 100644
index 00000000000..8b2cb728939
Binary files /dev/null and b/sound/weapons/bloodyslice.ogg differ