diff --git a/baystation12.dme b/baystation12.dme
index 829a6030dba..024b5731acc 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -334,6 +334,7 @@
#include "code\game\gamemodes\setupgame.dm"
#include "code\game\gamemodes\calamity\calamity.dm"
#include "code\game\gamemodes\changeling\changeling.dm"
+#include "code\game\gamemodes\changeling\changeling_items.dm"
#include "code\game\gamemodes\changeling\changeling_powers.dm"
#include "code\game\gamemodes\changeling\modularchangling.dm"
#include "code\game\gamemodes\cult\cult.dm"
diff --git a/code/game/gamemodes/changeling/changeling_items.dm b/code/game/gamemodes/changeling/changeling_items.dm
new file mode 100644
index 00000000000..cf27d5301ba
--- /dev/null
+++ b/code/game/gamemodes/changeling/changeling_items.dm
@@ -0,0 +1,91 @@
+/obj/item/weapon/melee/arm_blade
+ name = "arm blade"
+ desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
+ icon = 'icons/obj/changeling.dmi'
+ icon_state = "arm_blade"
+ item_state = "arm_blade"
+ contained_sprite = 1
+ w_class = 4
+ force = 30
+ sharp = 1
+ edge = 1
+ anchored = 1
+ throwforce = 0 //Just to be on the safe side
+ throw_range = 0
+ throw_speed = 0
+ can_embed = 0
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ var/mob/living/creator
+
+/obj/item/weapon/melee/arm_blade/New()
+ processing_objects |= src
+
+/obj/item/weapon/melee/arm_blade/Destroy()
+ processing_objects -= src
+ ..()
+
+/obj/item/weapon/melee/arm_blade/dropped()
+ visible_message("With a sickening crunch, [user] reforms their arm blade into an arm!",
+ "We assimilate the weapon back into our body.",
+ "You hear organic matter ripping and tearing!")
+ playsound(loc, 'sound/effects/blobattack.ogg', 30, 1)
+ spawn(1) if(src) qdel(src)
+
+/obj/item/weapon/melee/arm_blade/process()
+ if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
+ // Tidy up a bit.
+ if(istype(loc,/mob/living))
+ var/mob/living/carbon/human/host = loc
+ if(istype(host))
+ for(var/obj/item/organ/external/organ in host.organs)
+ for(var/obj/item/O in organ.implants)
+ if(O == src)
+ organ.implants -= src
+ host.pinned -= src
+ host.embedded -= src
+ host.drop_from_inventory(src)
+ spawn(1) if(src) qdel(src)
+
+/obj/item/weapon/shield/riot/changeling
+ name = "shield-like mass"
+ desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield."
+ icon = 'icons/obj/changeling.dmi'
+ icon_state = "ling_shield"
+ item_state = "ling_shield"
+ contained_sprite = 1
+ slot_flags = null
+ anchored = 1
+ throwforce = 0 //Just to be on the safe side
+ throw_range = 0
+ throw_speed = 0
+ can_embed = 0
+ var/mob/living/creator
+
+/obj/item/weapon/shield/riot/changeling/New()
+ processing_objects |= src
+
+/obj/item/weapon/shield/riot/changeling/Destroy()
+ processing_objects -= src
+ ..()
+
+/obj/item/weapon/shield/riot/changeling/dropped()
+ visible_message("With a sickening crunch, [user] reforms their arm blade into an arm!",
+ "We assimilate the weapon back into our body.",
+ "You hear organic matter ripping and tearing!")
+ playsound(loc, 'sound/effects/blobattack.ogg', 30, 1)
+ spawn(1) if(src) qdel(src)
+
+/obj/item/weapon/shield/riot/changeling/process()
+ if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
+ // Tidy up a bit.
+ if(istype(loc,/mob/living))
+ var/mob/living/carbon/human/host = loc
+ if(istype(host))
+ for(var/obj/item/organ/external/organ in host.organs)
+ for(var/obj/item/O in organ.implants)
+ if(O == src)
+ organ.implants -= src
+ host.pinned -= src
+ host.embedded -= src
+ host.drop_from_inventory(src)
+ spawn(1) if(src) qdel(src)
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index eb3a092a03c..f57322c47a1 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -1,8 +1,7 @@
var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
- var/list/absorbed_dna = list()
- var/list/absorbed_species = list()
+ var/list/datum/absorbed_dna/absorbed_dna = list()
var/list/absorbed_languages = list()
var/absorbedcount = 0
var/chem_charges = 20
@@ -31,12 +30,24 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
geneticdamage = max(0, geneticdamage-1)
/datum/changeling/proc/GetDNA(var/dna_owner)
- var/datum/dna/chosen_dna
- for(var/datum/dna/DNA in absorbed_dna)
- if(dna_owner == DNA.real_name)
- chosen_dna = DNA
- break
- return chosen_dna
+ for(var/datum/absorbed_dna/DNA in absorbed_dna)
+ if(dna_owner == DNA.name)
+ return DNA
+
+/mob/proc/absorbDNA(var/datum/absorbed_dna/newDNA)
+ var/datum/changeling/changeling = null
+ if(src.mind && src.mind.changeling)
+ changeling = src.mind.changeling
+ if(!changeling)
+ return
+
+ for(var/language in newDNA.languages)
+ changeling.absorbed_languages |= language
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ if(!changeling.GetDNA(newDNA.name)) // Don't duplicate - I wonder if it's possible for it to still be a different DNA? DNA code could use a rewrite
+ changeling.absorbed_dna += newDNA
//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
/mob/proc/make_changeling()
@@ -65,14 +76,13 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(!(P in src.verbs))
src.verbs += P.verbpath
- mind.changeling.absorbed_dna |= dna
+ for(var/language in languages)
+ mind.changeling.absorbed_languages |= language
var/mob/living/carbon/human/H = src
if(istype(H))
- mind.changeling.absorbed_species += H.species.name
-
- for(var/language in languages)
- mind.changeling.absorbed_languages |= language
+ var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.name, H.languages)
+ absorbDNA(newDNA)
return 1
@@ -83,13 +93,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(P.isVerb)
verbs -= P.verbpath
-//removes changeling powers but keeps those with allowduringlesserform
-/mob/proc/remove_changeling_powers_monkey()
- if(!mind || !mind.changeling) return
- for(var/datum/power/changeling/P in mind.changeling.purchasedpowers)
- if(P.isVerb && (P.allowduringlesserform == 0))
- verbs -= P.verbpath
-
//Helper proc. Does all the checks and stuff for us to avoid copypasta
/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
@@ -133,46 +136,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
return
-//Used to switch species based on the changeling datum.
-/mob/proc/changeling_change_species()
-
- set category = "Changeling"
- set name = "Change Species (5)"
-
- var/mob/living/carbon/human/H = src
- if(!istype(H))
- src << "We may only use this power while in humanoid form."
- return
-
- var/datum/changeling/changeling = changeling_power(5,1,0)
- if(!changeling) return
-
- if(changeling.absorbed_species.len < 2)
- src << "We do not know of any other species genomes to use."
- return
-
- var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
- if(!S) return
-
- domutcheck(src, null)
-
- changeling.chem_charges -= 5
- changeling.geneticdamage = 30
-
- src.visible_message("[src] transforms!")
-
- src.verbs -= /mob/proc/changeling_change_species
- H.set_species(S,1) //Until someone moves body colour into DNA, they're going to have to use the default.
-
- spawn(10)
- src.verbs += /mob/proc/changeling_change_species
- src.regenerate_icons()
-
- changeling_update_languages(changeling.absorbed_languages)
- feedback_add_details("changeling_powers","TR")
-
- return 1
-
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/proc/changeling_absorb_dna()
@@ -196,6 +159,10 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
src << "We do not know how to parse this creature's DNA!"
return
+ if(islesserform(T))
+ src << "This creature DNA is not compatible with our form!"
+ return
+
if(HUSK in T.mutations)
src << "This creature's DNA is ruined beyond useability!"
return
@@ -213,6 +180,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
switch(stage)
if(1)
src << "This creature is compatible. We must hold still..."
+ src.visible_message("[src]'s skin begins to shift and squirm!")
if(2)
src << "We extend a proboscis."
src.visible_message("[src] extends a proboscis!")
@@ -234,9 +202,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
src.visible_message("[src] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
- T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
- changeling.absorbed_dna |= T.dna
- if(src.nutrition < max_nutrition) src.nutrition = min((nutrition + T.nutrition), max_nutrition)
changeling.chem_charges += 10
changeling.geneticpoints += 2
@@ -247,16 +212,15 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
changeling_update_languages(changeling.absorbed_languages)
- //Steal their species!
- if(T.species && !(T.species.name in changeling.absorbed_species))
- changeling.absorbed_species += T.species.name
+ var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
+ absorbDNA(newDNA)
if(T.mind && T.mind.changeling)
if(T.mind.changeling.absorbed_dna)
- for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
- if(dna_data in changeling.absorbed_dna)
+ for(var/datum/absorbed_dna/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
+ if(changeling.GetDNA(dna_data.name))
continue
- changeling.absorbed_dna += dna_data
+ absorbDNA(dna_data)
changeling.absorbedcount++
T.mind.changeling.absorbed_dna.len = 1
@@ -295,31 +259,44 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
if(!changeling) return
var/list/names = list()
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- names += "[DNA.real_name]"
+ for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.name]"
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
- var/datum/dna/chosen_dna = changeling.GetDNA(S)
+ var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
changeling.chem_charges -= 5
- src.visible_message("[src] transforms!")
changeling.geneticdamage = 30
- src.dna = chosen_dna.Clone()
- src.real_name = chosen_dna.real_name
- src.flavor_text = ""
- src.UpdateAppearance()
- domutcheck(src, null)
+
+ handle_changeling_transform(chosen_dna)
src.verbs -= /mob/proc/changeling_transform
- spawn(10) src.verbs += /mob/proc/changeling_transform
+ spawn(10)
+ src.verbs += /mob/proc/changeling_transform
+
+ changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","TR")
return 1
+/mob/proc/handle_changeling_transform(var/datum/absorbed_dna/chosen_dna)
+ src.visible_message("[src] transforms!")
+
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ var/newSpecies = chosen_dna.speciesName
+ H.set_species(newSpecies,1)
+
+ src.dna = chosen_dna.dna
+ src.real_name = chosen_dna.name
+ src.flavor_text = ""
+ domutcheck(src, null)
+ src.UpdateAppearance()
+
//Transform into a monkey.
/mob/proc/changeling_lesser_form()
@@ -340,15 +317,10 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
return
changeling.chem_charges--
- H.remove_changeling_powers_monkey() //we weren't making us of allowduringlesserform before for some reason? -Ryan784
H.visible_message("[H] transforms!")
changeling.geneticdamage = 30
H << "Our genes cry out!"
- var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/weapon/implant/W in H)
- implants += W
- H.monkeyize()
- verbs += /mob/proc/changeling_lesser_transform //allow us to actually transform BACK into a human - Ryan784
+ H = H.monkeyize()
feedback_add_details("changeling_powers","LF")
return 1
@@ -457,25 +429,29 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
// charge the changeling chemical cost for stasis
changeling.chem_charges -= 20
- // restore us to health
- C.revive()
-
- // remove our fake death flag
- C.status_flags &= ~(FAKEDEATH)
-
- // let us move again
- C.update_canmove()
-
- // re-add out changeling powers
- C.make_changeling()
-
- // sending display messages
- C << "We have regenerated."
-
+ C << "We are ready to rise. Use the Revive verb when you are ready."
+ C.verbs += /mob/proc/changeling_revive
feedback_add_details("changeling_powers","FD")
return 1
+/mob/proc/changeling_revive()
+ set category = "Changeling"
+ set name = "Revive"
+
+ var/mob/living/carbon/C = src
+ // restore us to health
+ C.revive()
+ // remove our fake death flag
+ C.status_flags &= ~(FAKEDEATH)
+ // let us move again
+ C.update_canmove()
+ // re-add out changeling powers
+ C.make_changeling()
+ // sending display messages
+ C << "We have regenerated."
+ C.verbs -= /mob/proc/changeling_revive
+
//Boosts the range of your next sting attack by 1
/mob/proc/changeling_boost_range()
@@ -581,7 +557,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
// HIVE MIND UPLOAD/DOWNLOAD DNA
-var/list/datum/dna/hivemind_bank = list()
+var/list/datum/absorbed_dna/hivemind_bank = list()
/mob/proc/changeling_hiveupload()
set category = "Changeling"
@@ -592,9 +568,14 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling) return
var/list/names = list()
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- if(!(DNA in hivemind_bank))
- names += DNA.real_name
+ for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
+ var/valid = 1
+ for(var/datum/absorbed_dna/DNB in hivemind_bank)
+ if(DNA.name == DNB.name)
+ valid = 0
+ break
+ if(valid)
+ names += DNA.name
if(names.len <= 0)
src << "The airwaves already have all of our DNA."
@@ -603,7 +584,7 @@ var/list/datum/dna/hivemind_bank = list()
var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names
if(!S) return
- var/datum/dna/chosen_dna = changeling.GetDNA(S)
+ var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
@@ -622,9 +603,9 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling) return
var/list/names = list()
- for(var/datum/dna/DNA in hivemind_bank)
- if(!(DNA in changeling.absorbed_dna))
- names[DNA.real_name] = DNA
+ for(var/datum/absorbed_dna/DNA in hivemind_bank)
+ if(!(changeling.GetDNA(DNA.name)))
+ names[DNA.name] = DNA
if(names.len <= 0)
src << "There's no new DNA to absorb from the air."
@@ -637,7 +618,7 @@ var/list/datum/dna/hivemind_bank = list()
return
changeling.chem_charges -= 20
- changeling.absorbed_dna += chosen_dna
+ absorbDNA(chosen_dna)
src << "We absorb the DNA of [S] from the air."
feedback_add_details("changeling_powers","HD")
return 1
@@ -692,7 +673,7 @@ var/list/datum/dna/hivemind_bank = list()
return 1
//Handles the general sting code to reduce on copypasta (seeming as somebody decided to make SO MANY dumb abilities)
-/mob/proc/changeling_sting(var/required_chems=0, var/verb_path)
+/mob/proc/changeling_sting(var/required_chems=0, var/verb_path, var/stealthy = 0)
var/datum/changeling/changeling = changeling_power(required_chems)
if(!changeling) return
@@ -711,9 +692,20 @@ var/list/datum/dna/hivemind_bank = list()
src.verbs -= verb_path
spawn(10) src.verbs += verb_path
- src << "We stealthily sting [T]."
+ if(stealthy == 1)
+ src << "We stealthily sting [T]."
+ T << "You feel a tiny prick."
+ else
+ src.visible_message(pick("[src]'s eyes balloon and burst out in a welter of blood, burrowing into [T]!",
+ "[src]'s arm rapidly shifts into a giant scorpion-stinger and stabs into [T]!",
+ "[src]'s throat lengthens and twists before vomitting a chunky red spew all over [T]!",
+ "[src]'s tongue stretches an impossible length and stabs into [T]!",
+ "[src] sneezes a cloud of shrieking spiders at [T]!",
+ "[src] erupts a grotesque tail and impales [T]!",
+ "[src]'s chin skin bulges and tears, launching a bone-dart at [T]!"))
+
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
- T << "You feel a tiny prick."
+
return
@@ -722,7 +714,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Hallucination Sting (15)"
set desc = "Causes terror in the target."
- var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting)
+ var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting,stealthy = 1)
if(!T) return 0
spawn(rand(300,600))
if(T) T.hallucination += 400
@@ -734,7 +726,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Silence sting (10)"
set desc="Sting target"
- var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting)
+ var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting,stealthy = 1)
if(!T) return 0
T.silent += 30
feedback_add_details("changeling_powers","SS")
@@ -745,7 +737,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Blind sting (20)"
set desc="Sting target"
- var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting)
+ var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting,stealthy = 0)
if(!T) return 0
T << "Your eyes burn horrificly!"
T.disabilities |= NEARSIGHTED
@@ -760,7 +752,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Deaf sting (5)"
set desc="Sting target:"
- var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting)
+ var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting,stealthy = 0)
if(!T) return 0
T << "Your ears pop and begin ringing loudly!"
T.sdisabilities |= DEAF
@@ -773,7 +765,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Paralysis sting (30)"
set desc="Sting target"
- var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting)
+ var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting,stealthy = 0)
if(!T) return 0
T << "Your muscles begin to painfully tighten."
T.Weaken(20)
@@ -788,29 +780,25 @@ var/list/datum/dna/hivemind_bank = list()
var/datum/changeling/changeling = changeling_power(40)
if(!changeling) return 0
-
-
var/list/names = list()
- for(var/datum/dna/DNA in changeling.absorbed_dna)
- names += "[DNA.real_name]"
+ for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
+ names += "[DNA.name]"
var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names
if(!S) return
- var/datum/dna/chosen_dna = changeling.GetDNA(S)
+ var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S)
if(!chosen_dna)
return
- var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting)
+ var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting,stealthy = 1)
if(!T) return 0
if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T)))
src << "Our sting appears ineffective against its DNA."
return 0
- T.visible_message("[T] transforms!")
- T.dna = chosen_dna.Clone()
- T.real_name = chosen_dna.real_name
- T.UpdateAppearance()
- domutcheck(T, null)
+
+ T.handle_changeling_transform(chosen_dna)
+
feedback_add_details("changeling_powers","TS")
return 1
@@ -819,10 +807,9 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Unfat sting (5)"
set desc = "Sting target"
- var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting)
+ var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting,stealthy = 1)
if(!T) return 0
T << "you feel a small prick as stomach churns violently and you become to feel skinnier."
- T.overeatduration = 0
T.nutrition -= 100
feedback_add_details("changeling_powers","US")
return 1
@@ -832,13 +819,13 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Death Sting (40)"
set desc = "Causes spasms onto death."
- var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting)
+ var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting,stealthy = 0)
if(!T) return 0
T << "You feel a small prick and your chest becomes tight."
T.silent = 10
T.Paralyse(10)
T.make_jittery(1000)
- if(T.reagents) T.reagents.add_reagent("lexorin", 40)
+ if(T.reagents) T.reagents.add_reagent("cyanide", 5)
feedback_add_details("changeling_powers","DTHS")
return 1
@@ -853,13 +840,66 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling)
return 0
- var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting)
+ var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting,stealthy = 1)
if(!T) return 0
- T.dna.real_name = T.real_name
- changeling.absorbed_dna |= T.dna
- if(T.species && !(T.species.name in changeling.absorbed_species))
- changeling.absorbed_species += T.species.name
+ var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages)
+ absorbDNA(newDNA)
feedback_add_details("changeling_powers","ED")
return 1
+
+/mob/proc/armblades()
+ set category = "Changeling"
+ set name = "Form Blades"
+ set desc="Rupture the flesh and mend the bone of your hand into a deadly blade."
+
+ var/mob/living/M = src
+
+ if(M.l_hand && M.r_hand)
+ M << "Your hands are full."
+ return
+
+ 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)
+ 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!")
+ gibs(src.loc)
+
+/mob/proc/changeling_shield()
+ set category = "Changeling"
+ set name = "Form Shield"
+ set desc="Bend the flesh and bone of your hand into a grotesque shield."
+
+ var/mob/living/M = src
+
+ if(M.l_hand && M.r_hand)
+ M << "Your hands are full."
+ return
+
+ var/obj/item/weapon/shield/riot/changeling/shield = new(M)
+ 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!",
+ "We inflate our hand into a robust shield.",
+ "You hear organic matter ripping and tearing!")
+ gibs(src.loc)
+
+//dna related datum
+
+/datum/absorbed_dna
+ var/name
+ var/datum/dna/dna
+ var/speciesName
+ var/list/languages
+
+/datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages)
+ ..()
+ name = newName
+ dna = newDNA
+ speciesName = newSpecies
+ languages = newLanguages
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 7ba0052b816..303016281a2 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -26,12 +26,6 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 0
verbpath = /mob/proc/changeling_transform
-/datum/power/changeling/change_species
- name = "Change Species"
- desc = "We take on the apperance of a species that we have absorbed."
- genomecost = 0
- verbpath = /mob/proc/changeling_change_species
-
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
@@ -64,14 +58,14 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/deaf_sting
name = "Deaf Sting"
- desc = "We silently sting a human, completely deafening them for a short time."
+ desc = "We sting a human, completely deafening them for a short time."
genomecost = 1
allowduringlesserform = 1
verbpath = /mob/proc/changeling_deaf_sting
/datum/power/changeling/blind_sting
name = "Blind Sting"
- desc = "We silently sting a human, completely blinding them for a short time."
+ desc = "We sting a human, completely blinding them for a short time."
genomecost = 2
allowduringlesserform = 1
verbpath = /mob/proc/changeling_blind_sting
@@ -108,7 +102,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/paralysis_sting
name = "Paralysis Sting"
- desc = "We silently sting a human, paralyzing them for a short time."
+ desc = "We sting a human, paralyzing them for a short time."
genomecost = 8
verbpath = /mob/proc/changeling_paralysis_sting
@@ -121,7 +115,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/DeathSting
name = "Death Sting"
- desc = "We silently sting a human, filling them with potent chemicals. Their rapid death is all but assured."
+ desc = "We sting a human, filling them with potent chemicals. Their rapid death is all but assured."
genomecost = 10
verbpath = /mob/proc/changeling_DEATHsting
@@ -184,7 +178,19 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 7
verbpath = /mob/proc/changeling_rapidregen
+//weapon and armor like powers
+/datum/power/changeling/armblades
+ name = "Mutate Armblades"
+ desc = "Permits us to reshape our arms into a deadly blade."
+ genomecost = 2
+ verbpath = /mob/proc/armblades
+
+/datum/power/changeling/shield
+ name = "Mutate Shield"
+ desc = "Permits us to bloat our hands into a robust shield."
+ genomecost = 3
+ verbpath = /mob/proc/changeling_shield
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
diff --git a/html/changelogs/alberyk-PR-1765.yml b/html/changelogs/alberyk-PR-1765.yml
new file mode 100644
index 00000000000..5af08198159
--- /dev/null
+++ b/html/changelogs/alberyk-PR-1765.yml
@@ -0,0 +1,12 @@
+author: Alberyk
+
+delete-after: True
+
+changes:
+ - rscadd: "Added arm blades and arm shields abilities to changelings."
+ - rscadd: "Added visible messages to certain lings stings."
+ - tweak: "Changelings can now select when getting up after using their regeneration skill."
+ - tweak: "Changeling transform will now change to the species of the selected dna, replacing change species."
+ - tweak: "Changelings can't absorb monkeys anymore."
+ - bugfix: "Fixed organ rejection caused by ling transformation."
+ - bugfix: "Fixed changeling stings affecting ipcs."
diff --git a/icons/obj/changeling.dmi b/icons/obj/changeling.dmi
new file mode 100644
index 00000000000..15f0e3a9475
Binary files /dev/null and b/icons/obj/changeling.dmi differ