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