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