diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index c19dc2c180..24ccdff244 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -113,6 +113,7 @@ GLOBAL_LIST_EMPTY(mutations_list) /datum/mutation/human/proc/get_spans() return list() +<<<<<<< HEAD /datum/mutation/human/hulk name = "Hulk" @@ -650,6 +651,8 @@ GLOBAL_LIST_EMPTY(mutations_list) owner.LaserEyes(target, mouseparams) +======= +>>>>>>> b6741ca... Splits mutations from mutations.dm into a subfolder, /datums/mutations (#33079) /mob/living/carbon/proc/update_mutations_overlay() return diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm new file mode 100644 index 0000000000..23b91add58 --- /dev/null +++ b/code/datums/mutations/body.dm @@ -0,0 +1,148 @@ +//These mutations change your overall "form" somehow, like size + +//Epilepsy gives a very small chance to have a seizure every life tick, knocking you unconscious. +/datum/mutation/human/epilepsy + name = "Epilepsy" + quality = NEGATIVE + text_gain_indication = "You get a headache." + +/datum/mutation/human/epilepsy/on_life(mob/living/carbon/human/owner) + if(prob(1) && owner.stat == CONSCIOUS) + owner.visible_message("[owner] starts having a seizure!", "You have a seizure!") + owner.Unconscious(200) + owner.Jitter(1000) + addtimer(CALLBACK(src, .proc/jitter_less, owner), 90) + +/datum/mutation/human/epilepsy/proc/jitter_less(mob/living/carbon/human/owner) + if(owner) + owner.jitteriness = 10 + + +//Unstable DNA induces random mutations! +/datum/mutation/human/bad_dna + name = "Unstable DNA" + quality = NEGATIVE + text_gain_indication = "You feel strange." + +/datum/mutation/human/bad_dna/on_acquiring(mob/living/carbon/human/owner) + to_chat(owner, text_gain_indication) + var/mob/new_mob + if(prob(95)) + if(prob(50)) + new_mob = owner.randmutb() + else + new_mob = owner.randmuti() + else + new_mob = owner.randmutg() + if(new_mob && ismob(new_mob)) + owner = new_mob + . = owner + on_losing(owner) + + +//Cough gives you a chronic cough that causes you to drop items. +/datum/mutation/human/cough + name = "Cough" + quality = MINOR_NEGATIVE + text_gain_indication = "You start coughing." + +/datum/mutation/human/cough/on_life(mob/living/carbon/human/owner) + if(prob(5) && owner.stat == CONSCIOUS) + owner.drop_all_held_items() + owner.emote("cough") + + +//Dwarfism shrinks your body and lets you pass tables. +/datum/mutation/human/dwarfism + name = "Dwarfism" + quality = POSITIVE + get_chance = 15 + lowest_value = 256 * 12 + +/datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.resize = 0.8 + owner.update_transform() + owner.pass_flags |= PASSTABLE + owner.visible_message("[owner] suddenly shrinks!", "Everything around you seems to grow..") + +/datum/mutation/human/dwarfism/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.resize = 1.25 + owner.update_transform() + owner.pass_flags &= ~PASSTABLE + owner.visible_message("[owner] suddenly grows!", "Everything around you seems to shrink..") + + +//Clumsiness has a very large amount of small drawbacks depending on item. +/datum/mutation/human/clumsy + name = "Clumsiness" + quality = MINOR_NEGATIVE + text_gain_indication = "You feel lightheaded." + +/datum/mutation/human/clumsy/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.disabilities |= CLUMSY + +/datum/mutation/human/clumsy/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.disabilities &= ~CLUMSY + + +//Tourettes causes you to randomly stand in place and shout. +/datum/mutation/human/tourettes + name = "Tourettes Syndrome" + quality = NEGATIVE + text_gain_indication = "You twitch." + +/datum/mutation/human/tourettes/on_life(mob/living/carbon/human/owner) + if(prob(10) && owner.stat == CONSCIOUS) + owner.Stun(200) + switch(rand(1, 3)) + if(1) + owner.emote("twitch") + if(2 to 3) + owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]") + var/x_offset_old = owner.pixel_x + var/y_offset_old = owner.pixel_y + var/x_offset = owner.pixel_x + rand(-2,2) + var/y_offset = owner.pixel_y + rand(-1,1) + animate(owner, pixel_x = x_offset, pixel_y = y_offset, time = 1) + animate(owner, pixel_x = x_offset_old, pixel_y = y_offset_old, time = 1) + + +//Deafness makes you deaf. +/datum/mutation/human/deaf + name = "Deafness" + quality = NEGATIVE + text_gain_indication = "You can't seem to hear anything." + +/datum/mutation/human/deaf/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.disabilities |= DEAF + +/datum/mutation/human/deaf/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.disabilities &= ~DEAF + + +//Monified turns you into a monkey. +/datum/mutation/human/race + name = "Monkified" + quality = NEGATIVE + time_coeff = 2 + +/datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + . = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + +/datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner) + if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src))) + . = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm new file mode 100644 index 0000000000..da10510970 --- /dev/null +++ b/code/datums/mutations/chameleon.dm @@ -0,0 +1,30 @@ +//Chameleon causes the owner to slowly become transparent when not moving. +/datum/mutation/human/chameleon + name = "Chameleon" + quality = POSITIVE + get_chance = 20 + lowest_value = 256 * 12 + text_gain_indication = "You feel one with your surroundings." + text_lose_indication = "You feel oddly exposed." + time_coeff = 5 + +/datum/mutation/human/chameleon/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY + +/datum/mutation/human/chameleon/on_life(mob/living/carbon/human/owner) + owner.alpha = max(0, owner.alpha - 25) + +/datum/mutation/human/chameleon/on_move(mob/living/carbon/human/owner) + owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY + +/datum/mutation/human/chameleon/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) + if(proximity) //stops tk from breaking chameleon + owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY + return + +/datum/mutation/human/chameleon/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.alpha = 255 diff --git a/code/datums/mutations/cold_resistance.dm b/code/datums/mutations/cold_resistance.dm new file mode 100644 index 0000000000..6281514e71 --- /dev/null +++ b/code/datums/mutations/cold_resistance.dm @@ -0,0 +1,20 @@ +//Cold Resistance gives your entire body an orange halo, and makes you immune to the effects of vacuum and cold. +/datum/mutation/human/cold_resistance + name = "Cold Resistance" + quality = POSITIVE + get_chance = 25 + lowest_value = 256 * 12 + text_gain_indication = "Your body feels warm!" + time_coeff = 5 + +/datum/mutation/human/cold_resistance/New() + ..() + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "fire", -MUTATIONS_LAYER) + +/datum/mutation/human/cold_resistance/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[1] + +/datum/mutation/human/cold_resistance/on_life(mob/living/carbon/human/owner) + if(owner.getFireLoss()) + if(prob(1)) + owner.heal_bodypart_damage(0,1) //Is this really needed? diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm new file mode 100644 index 0000000000..9340361930 --- /dev/null +++ b/code/datums/mutations/hulk.dm @@ -0,0 +1,36 @@ +//Hulk turns your skin green, and allows you to punch through walls. +/datum/mutation/human/hulk + name = "Hulk" + quality = POSITIVE + get_chance = 15 + lowest_value = 256 * 12 + text_gain_indication = "Your muscles hurt!" + species_allowed = list("human") //no skeleton/lizard hulk + health_req = 25 + +/datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + var/status = CANSTUN | CANKNOCKDOWN | CANUNCONSCIOUS | CANPUSH + owner.status_flags &= ~status + owner.update_body_parts() + +/datum/mutation/human/hulk/on_attack_hand(mob/living/carbon/human/owner, atom/target, proximity) + if(proximity) //no telekinetic hulk attack + return target.attack_hulk(owner) + +/datum/mutation/human/hulk/on_life(mob/living/carbon/human/owner) + if(owner.health < 0) + on_losing(owner) + to_chat(owner, "You suddenly feel very weak.") + +/datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.status_flags |= CANSTUN | CANKNOCKDOWN | CANUNCONSCIOUS | CANPUSH + owner.update_body_parts() + +/datum/mutation/human/hulk/say_mod(message) + if(message) + message = "[uppertext(replacetext(message, ".", "!"))]!!" + return message diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm new file mode 100644 index 0000000000..dee26166dd --- /dev/null +++ b/code/datums/mutations/sight.dm @@ -0,0 +1,74 @@ +//Nearsightedness restricts your vision by several tiles. +/datum/mutation/human/nearsight + name = "Near Sightness" + quality = MINOR_NEGATIVE + text_gain_indication = "You can't see very well." + +/datum/mutation/human/nearsight/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.become_nearsighted() + +/datum/mutation/human/nearsight/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.cure_nearsighted() + + +//Blind makes you blind. Who knew? +/datum/mutation/human/blind + name = "Blindness" + quality = NEGATIVE + text_gain_indication = "You can't seem to see anything." + +/datum/mutation/human/blind/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.become_blind() + +/datum/mutation/human/blind/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.cure_blind() + + +//X-Ray Vision lets you see through walls. +/datum/mutation/human/x_ray + name = "X Ray Vision" + quality = POSITIVE + get_chance = 25 + lowest_value = 256 * 12 + text_gain_indication = "The walls suddenly disappear!" + time_coeff = 2 + +/datum/mutation/human/x_ray/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + + owner.update_sight() + +/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.update_sight() + + +//Laser Eyes lets you shoot lasers from your eyes! +/datum/mutation/human/laser_eyes + name = "Laser Eyes" + quality = POSITIVE + dna_block = NON_SCANNABLE + text_gain_indication = "You feel pressure building up behind your eyes." + layer_used = FRONT_MUTATIONS_LAYER + limb_req = "head" + +/datum/mutation/human/laser_eyes/New() + ..() + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "lasereyes", -FRONT_MUTATIONS_LAYER) + +/datum/mutation/human/laser_eyes/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[1] + +/datum/mutation/human/laser_eyes/on_ranged_attack(mob/living/carbon/human/owner, atom/target, mouseparams) + if(owner.a_intent == INTENT_HARM) + owner.LaserEyes(target, mouseparams) diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm new file mode 100644 index 0000000000..2959c73125 --- /dev/null +++ b/code/datums/mutations/speech.dm @@ -0,0 +1,231 @@ +//These are all minor mutations that affect your speech somehow. +//Individual ones aren't commented since their functions should be evident at a glance + +/datum/mutation/human/nervousness + name = "Nervousness" + quality = MINOR_NEGATIVE + text_gain_indication = "You feel nervous." + +/datum/mutation/human/nervousness/on_life(mob/living/carbon/human/owner) + if(prob(10)) + owner.stuttering = max(10, owner.stuttering) + + +/datum/mutation/human/wacky + name = "Wacky" + quality = MINOR_NEGATIVE + text_gain_indication = "You feel an off sensation in your voicebox." + text_lose_indication = "The off sensation passes." + +/datum/mutation/human/wacky/get_spans() + return list(SPAN_SANS) + + +/datum/mutation/human/mute + name = "Mute" + quality = NEGATIVE + text_gain_indication = "You feel unable to express yourself at all." + text_lose_indication = "You feel able to speak freely again." + +/datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner) + if(..()) + return + owner.disabilities |= MUTE + +/datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner) + if(..()) + return + owner.disabilities &= ~MUTE + + +/datum/mutation/human/smile + name = "Smile" + quality = MINOR_NEGATIVE + dna_block = NON_SCANNABLE + text_gain_indication = "You feel so happy. Nothing can be wrong with anything. :)" + text_lose_indication = "Everything is terrible again. :(" + +/datum/mutation/human/smile/say_mod(message) + if(message) + message = " [message] " + //Time for a friendly game of SS13 + message = replacetext(message," stupid "," smart ") + message = replacetext(message," retard "," genius ") + message = replacetext(message," unrobust "," robust ") + message = replacetext(message," dumb "," smart ") + message = replacetext(message," awful "," great ") + message = replacetext(message," gay ",pick(" nice "," ok "," alright ")) + message = replacetext(message," horrible "," fun ") + message = replacetext(message," terrible "," terribly fun ") + message = replacetext(message," terrifying "," wonderful ") + message = replacetext(message," gross "," cool ") + message = replacetext(message," disgusting "," amazing ") + message = replacetext(message," loser "," winner ") + message = replacetext(message," useless "," useful ") + message = replacetext(message," oh god "," cheese and crackers ") + message = replacetext(message," jesus "," gee wiz ") + message = replacetext(message," weak "," strong ") + message = replacetext(message," kill "," hug ") + message = replacetext(message," murder "," tease ") + message = replacetext(message," ugly "," beautiful ") + message = replacetext(message," douchbag "," nice guy ") + message = replacetext(message," whore "," lady ") + message = replacetext(message," nerd "," smart guy ") + message = replacetext(message," moron "," fun person ") + message = replacetext(message," IT'S LOOSE "," EVERYTHING IS FINE ") + message = replacetext(message," sex "," hug fight ") + message = replacetext(message," idiot "," genius ") + message = replacetext(message," fat "," thin ") + message = replacetext(message," beer "," water with ice ") + message = replacetext(message," drink "," water ") + message = replacetext(message," feminist "," empowered woman ") + message = replacetext(message," i hate you "," you're mean ") + message = replacetext(message," nigger "," african american ") + message = replacetext(message," jew "," jewish ") + message = replacetext(message," shit "," shiz ") + message = replacetext(message," crap "," poo ") + message = replacetext(message," slut "," tease ") + message = replacetext(message," ass "," butt ") + message = replacetext(message," damn "," dang ") + message = replacetext(message," fuck "," ") + message = replacetext(message," penis "," privates ") + message = replacetext(message," cunt "," privates ") + message = replacetext(message," dick "," jerk ") + message = replacetext(message," vagina "," privates ") + return trim(message) + + +/datum/mutation/human/unintelligable + name = "Unintelligable" + quality = NEGATIVE + text_gain_indication = "You can't seem to form any coherent thoughts!" + text_lose_indication = "Your mind feels more clear." + +/datum/mutation/human/unintelligable/say_mod(message) + if(message) + var/prefix=copytext(message,1,2) + if(prefix == ";") + message = copytext(message,2) + else if(prefix in list(":","#")) + prefix += copytext(message,2,3) + message = copytext(message,3) + else + prefix="" + + var/list/words = splittext(message," ") + var/list/rearranged = list() + for(var/i=1;i<=words.len;i++) + var/cword = pick(words) + words.Remove(cword) + var/suffix = copytext(cword,length(cword)-1,length(cword)) + while(length(cword)>0 && suffix in list(".",",",";","!",":","?")) + cword = copytext(cword,1 ,length(cword)-1) + suffix = copytext(cword,length(cword)-1,length(cword) ) + if(length(cword)) + rearranged += cword + message = "[prefix][uppertext(jointext(rearranged," "))]!!" + return message + + +/datum/mutation/human/swedish + name = "Swedish" + quality = MINOR_NEGATIVE + dna_block = NON_SCANNABLE + text_gain_indication = "You feel Swedish, however that works." + text_lose_indication = "The feeling of Swedishness passes." + +/datum/mutation/human/swedish/say_mod(message) + if(message) + message = replacetext(message,"w","v") + message = replacetext(message,"j","y") + message = replacetext(message,"a",pick("�","�","�","a")) + message = replacetext(message,"bo","bjo") + message = replacetext(message,"o",pick("�","�","o")) + if(prob(30)) + message += " Bork[pick("",", bork",", bork, bork")]!" + return message + + +/datum/mutation/human/chav + name = "Chav" + quality = MINOR_NEGATIVE + dna_block = NON_SCANNABLE + text_gain_indication = "Ye feel like a reet prat like, innit?" + text_lose_indication = "You no longer feel like being rude and sassy." + +/datum/mutation/human/chav/say_mod(message) + if(message) + message = " [message] " + message = replacetext(message," looking at "," gawpin' at ") + message = replacetext(message," great "," bangin' ") + message = replacetext(message," man "," mate ") + message = replacetext(message," friend ",pick(" mate "," bruv "," bledrin ")) + message = replacetext(message," what "," wot ") + message = replacetext(message," drink "," wet ") + message = replacetext(message," get "," giz ") + message = replacetext(message," what "," wot ") + message = replacetext(message," no thanks "," wuddent fukken do one ") + message = replacetext(message," i don't know "," wot mate ") + message = replacetext(message," no "," naw ") + message = replacetext(message," robust "," chin ") + message = replacetext(message," hi "," how what how ") + message = replacetext(message," hello "," sup bruv ") + message = replacetext(message," kill "," bang ") + message = replacetext(message," murder "," bang ") + message = replacetext(message," windows "," windies ") + message = replacetext(message," window "," windy ") + message = replacetext(message," break "," do ") + message = replacetext(message," your "," yer ") + message = replacetext(message," security "," coppers ") + return trim(message) + + +/datum/mutation/human/elvis + name = "Elvis" + quality = MINOR_NEGATIVE + dna_block = NON_SCANNABLE + text_gain_indication = "You feel pretty good, honeydoll." + text_lose_indication = "You feel a little less conversation would be great." + +/datum/mutation/human/elvis/on_life(mob/living/carbon/human/owner) + switch(pick(1,2)) + if(1) + if(prob(15)) + var/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing") + var/dancemoves = pick(dancetypes) + owner.visible_message("[owner] busts out some [dancemoves] moves!") + if(2) + if(prob(15)) + owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!") + +/datum/mutation/human/elvis/say_mod(message) + if(message) + message = " [message] " + message = replacetext(message," i'm not "," I aint ") + message = replacetext(message," girl ",pick(" honey "," baby "," baby doll ")) + message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo ")) + message = replacetext(message," out of "," outta ") + message = replacetext(message," thank you "," thank you, thank you very much ") + message = replacetext(message," what are you "," whatcha ") + message = replacetext(message," yes ",pick(" sure", "yea ")) + message = replacetext(message," faggot "," square ") + message = replacetext(message," muh valids "," getting my kicks ") + return trim(message) + + +/datum/mutation/human/stoner + name = "Stoner" + quality = NEGATIVE + dna_block = NON_SCANNABLE + text_gain_indication = "You feel...totally chill, man!" + text_lose_indication = "You feel like you have a better sense of time." + +/datum/mutation/human/stoner/on_acquiring(mob/living/carbon/human/owner) + ..() + owner.grant_language(/datum/language/beachbum) + owner.remove_language(/datum/language/common) + +/datum/mutation/human/stoner/on_losing(mob/living/carbon/human/owner) + ..() + owner.grant_language(/datum/language/common) + owner.remove_language(/datum/language/beachbum) diff --git a/code/datums/mutations/telekinesis.dm b/code/datums/mutations/telekinesis.dm new file mode 100644 index 0000000000..3aa562ee74 --- /dev/null +++ b/code/datums/mutations/telekinesis.dm @@ -0,0 +1,18 @@ +//Telekinesis lets you interact with objects from range, and gives you a light blue halo around your head. +/datum/mutation/human/telekinesis + name = "Telekinesis" + quality = POSITIVE + get_chance = 20 + lowest_value = 256 * 12 + text_gain_indication = "You feel smarter!" + limb_req = "head" + +/datum/mutation/human/telekinesis/New() + ..() + visual_indicators |= mutable_appearance('icons/effects/genetics.dmi', "telekinesishead", -MUTATIONS_LAYER) + +/datum/mutation/human/telekinesis/get_visual_indicator(mob/living/carbon/human/owner) + return visual_indicators[1] + +/datum/mutation/human/telekinesis/on_ranged_attack(mob/living/carbon/human/owner, atom/target) + target.attack_tk(owner) diff --git a/tgstation.dme b/tgstation.dme index e5d267b667..0648584f2e 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -411,6 +411,13 @@ #include "code\datums\martial\plasma_fist.dm" #include "code\datums\martial\sleeping_carp.dm" #include "code\datums\martial\wrestling.dm" +#include "code\datums\mutations\body.dm" +#include "code\datums\mutations\chameleon.dm" +#include "code\datums\mutations\cold_resistance.dm" +#include "code\datums\mutations\hulk.dm" +#include "code\datums\mutations\sight.dm" +#include "code\datums\mutations\speech.dm" +#include "code\datums\mutations\telekinesis.dm" #include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" #include "code\datums\status_effects\buffs.dm"