//predominantly negative traits /datum/quirk/badback name = "Bad Back" desc = "Thanks to your poor posture, backpacks and other bags never sit right on your back. More evently weighted objects are fine, though." value = -2 mood_quirk = TRUE gain_text = "Your back REALLY hurts!" lose_text = "Your back feels better." medical_record_text = "Patient scans indicate severe and chronic back pain." /datum/quirk/badback/on_process() var/mob/living/carbon/human/H = quirk_holder if(H.back && istype(H.back, /obj/item/storage/backpack)) SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "back_pain", /datum/mood_event/back_pain) else SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "back_pain") /datum/quirk/blooddeficiency name = "Blood Deficiency" desc = "Your body can't produce enough blood to sustain itself." value = -2 gain_text = "You feel your vigor slowly fading away." lose_text = "You feel vigorous again." medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." /datum/quirk/blooddeficiency/on_process() var/mob/living/carbon/human/H = quirk_holder if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any return else if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment H.blood_volume -= 0.275 /datum/quirk/blindness name = "Blind" desc = "You are completely blind, nothing can counteract this." value = -4 gain_text = "You can't see anything." lose_text = "You miraculously gain back your vision." medical_record_text = "Patient has permanent blindness." /datum/quirk/blindness/add() quirk_holder.become_blind(ROUNDSTART_TRAIT) /datum/quirk/blindness/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/blindfold/white/B = new(get_turf(H)) if(!H.equip_to_slot_if_possible(B, SLOT_GLASSES, bypass_equip_delay_self = TRUE)) //if you can't put it on the user's eyes, put it in their hands, otherwise put it on their eyes H.put_in_hands(B) H.regenerate_icons() /datum/quirk/brainproblems name = "Brain Tumor" desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!" value = -3 gain_text = "You feel smooth." lose_text = "You feel wrinkled again." medical_record_text = "Patient has a tumor in their brain that is slowly driving them to brain death." /datum/quirk/brainproblems/on_process() quirk_holder.adjustBrainLoss(0.2) /datum/quirk/deafness name = "Deaf" desc = "You are incurably deaf." value = -2 mob_trait = TRAIT_DEAF gain_text = "You can't hear anything." lose_text = "You're able to hear again!" medical_record_text = "Patient's cochlear nerve is incurably damaged." /datum/quirk/depression name = "Depression" desc = "You sometimes just hate life." mob_trait = TRAIT_DEPRESSION value = -1 gain_text = "You start feeling depressed." lose_text = "You no longer feel depressed." //if only it were that easy! medical_record_text = "Patient has a severe mood disorder, causing them to experience acute episodes of depression." mood_quirk = TRUE /datum/quirk/depression/on_process() if(prob(0.05)) SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "depression", /datum/mood_event/depression) /datum/quirk/family_heirloom name = "Family Heirloom" desc = "You are the current owner of an heirloom, passed down for generations. You have to keep it safe!" value = -1 mood_quirk = TRUE var/obj/item/heirloom var/where medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom." /datum/quirk/family_heirloom/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/heirloom_type if(is_species(H, /datum/species/moth) && prob(50)) heirloom_type = /obj/item/flashlight/lantern/heirloom_moth else switch(quirk_holder.mind.assigned_role) //Service jobs if("Clown") heirloom_type = /obj/item/bikehorn/golden if("Mime") heirloom_type = /obj/item/reagent_containers/food/snacks/baguette if("Janitor") heirloom_type = pick(/obj/item/mop, /obj/item/caution, /obj/item/reagent_containers/glass/bucket) if("Cook") heirloom_type = pick(/obj/item/reagent_containers/food/condiment/saltshaker, /obj/item/kitchen/rollingpin, /obj/item/clothing/head/chefhat) if("Botanist") heirloom_type = pick(/obj/item/cultivator, /obj/item/reagent_containers/glass/bucket, /obj/item/storage/bag/plants) if("Bartender") heirloom_type = pick(/obj/item/reagent_containers/glass/rag, /obj/item/clothing/head/that, /obj/item/reagent_containers/food/drinks/shaker) if("Curator") heirloom_type = pick(/obj/item/pen/fountain, /obj/item/storage/pill_bottle/dice) if("Assistant") heirloom_type = /obj/item/storage/toolbox/mechanical/old/heirloom //Security/Command if("Captain") heirloom_type = /obj/item/reagent_containers/food/drinks/flask/gold if("Head of Security") heirloom_type = /obj/item/book/manual/wiki/security_space_law if("Warden") heirloom_type = /obj/item/book/manual/wiki/security_space_law if("Security Officer") heirloom_type = pick(/obj/item/book/manual/wiki/security_space_law, /obj/item/clothing/head/beret/sec) if("Detective") heirloom_type = /obj/item/reagent_containers/food/drinks/bottle/whiskey if("Lawyer") heirloom_type = pick(/obj/item/gavelhammer, /obj/item/book/manual/wiki/security_space_law) //RnD if("Research Director") heirloom_type = /obj/item/toy/plush/slimeplushie if("Scientist") heirloom_type = /obj/item/toy/plush/slimeplushie if("Roboticist") heirloom_type = pick(subtypesof(/obj/item/toy/prize)) //look at this nerd //Medical if("Chief Medical Officer") heirloom_type = pick(/obj/item/clothing/neck/stethoscope, /obj/item/bodybag) if("Medical Doctor") heirloom_type = pick(/obj/item/clothing/neck/stethoscope, /obj/item/bodybag) if("Chemist") heirloom_type = /obj/item/book/manual/wiki/chemistry if("Virologist") heirloom_type = /obj/item/reagent_containers/syringe //Engineering if("Chief Engineer") heirloom_type = pick(/obj/item/clothing/head/hardhat/white, /obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool, /obj/item/crowbar, /obj/item/wirecutters) if("Station Engineer") heirloom_type = pick(/obj/item/clothing/head/hardhat, /obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool, /obj/item/crowbar, /obj/item/wirecutters) if("Atmospheric Technician") heirloom_type = pick(/obj/item/lighter, /obj/item/lighter/greyscale, /obj/item/storage/box/matches) //Supply if("Quartermaster") heirloom_type = pick(/obj/item/stamp, /obj/item/stamp/denied) if("Cargo Technician") heirloom_type = /obj/item/clipboard if("Shaft Miner") heirloom_type = pick(/obj/item/pickaxe/mini, /obj/item/shovel) if(!heirloom_type) heirloom_type = pick( /obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20) heirloom = new heirloom_type(get_turf(quirk_holder)) var/list/slots = list( "in your left pocket" = SLOT_L_STORE, "in your right pocket" = SLOT_R_STORE, "in your backpack" = SLOT_IN_BACKPACK ) where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet" /datum/quirk/family_heirloom/post_add() if(where == "in your backpack") var/mob/living/carbon/human/H = quirk_holder SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H) to_chat(quirk_holder, "There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!") var/list/names = splittext(quirk_holder.real_name, " ") var/family_name = names[names.len] heirloom.AddComponent(/datum/component/heirloom, quirk_holder.mind, family_name) /datum/quirk/family_heirloom/on_process() if(heirloom in quirk_holder.GetAllContents()) SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) else SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) /datum/quirk/family_heirloom/clone_data() return heirloom /datum/quirk/family_heirloom/on_clone(data) heirloom = data /datum/quirk/heavy_sleeper name = "Heavy Sleeper" desc = "You sleep like a rock! Whenever you're put to sleep or knocked unconscious, you take a little bit longer to wake up." value = -1 mob_trait = TRAIT_HEAVY_SLEEPER gain_text = "You feel sleepy." lose_text = "You feel awake again." medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up." /datum/quirk/hypersensitive name = "Hypersensitive" desc = "For better or worse, everything seems to affect your mood more than it should." value = -1 gain_text = "You seem to make a big deal out of everything." lose_text = "You don't seem to make a big deal out of everything anymore." medical_record_text = "Patient demonstrates a high level of emotional volatility." /datum/quirk/hypersensitive/add() GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) if(mood) mood.mood_modifier += 0.5 /datum/quirk/hypersensitive/remove() if(quirk_holder) GET_COMPONENT_FROM(mood, /datum/component/mood, quirk_holder) if(mood) mood.mood_modifier -= 0.5 /datum/quirk/light_drinker name = "Light Drinker" desc = "You just can't handle your drinks and get drunk very quickly." value = -1 mob_trait = TRAIT_LIGHT_DRINKER gain_text = "Just the thought of drinking alcohol makes your head spin." lose_text = "You're no longer severely affected by alcohol." medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)" /datum/quirk/nearsighted //t. errorage name = "Nearsighted" desc = "You are nearsighted without prescription glasses, but spawn with a pair." value = -1 gain_text = "Things far away from you start looking blurry." lose_text = "You start seeing faraway things normally again." medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." /datum/quirk/nearsighted/add() quirk_holder.become_nearsighted(ROUNDSTART_TRAIT) /datum/quirk/nearsighted/on_spawn() var/mob/living/carbon/human/H = quirk_holder var/obj/item/clothing/glasses/regular/glasses = new(get_turf(H)) H.put_in_hands(glasses) H.equip_to_slot(glasses, SLOT_GLASSES) H.regenerate_icons() //this is to remove the inhand icon, which persists even if it's not in their hands /datum/quirk/nyctophobia name = "Nyctophobia" desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread." value = -1 medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)" /datum/quirk/nyctophobia/on_process() var/mob/living/carbon/human/H = quirk_holder if(H.dna.species.id in list("shadow", "nightmare")) return //we're tied with the dark, so we don't get scared of it; don't cleanse outright to avoid cheese var/turf/T = get_turf(quirk_holder) var/lums = T.get_lumcount() if(lums <= 0.2) if(quirk_holder.m_intent == MOVE_INTENT_RUN) to_chat(quirk_holder, "Easy, easy, take it slow... you're in the dark...") quirk_holder.toggle_move_intent() SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) else SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") /datum/quirk/nonviolent name = "Pacifist" desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone." value = -2 mob_trait = TRAIT_PACIFISM gain_text = "You feel repulsed by the thought of violence!" lose_text = "You think you can defend yourself again." medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm." /datum/quirk/paraplegic name = "Paraplegic" desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" value = -3 human_only = TRUE gain_text = null // Handled by trauma. lose_text = null medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." /datum/quirk/paraplegic/add() var/datum/brain_trauma/severe/paralysis/paraplegic/T = new() var/mob/living/carbon/human/H = quirk_holder H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/paraplegic/on_spawn() if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. quirk_holder.buckled.unbuckle_mob(quirk_holder) var/turf/T = get_turf(quirk_holder) var/obj/structure/chair/spawn_chair = locate() in T var/obj/vehicle/ridden/wheelchair/wheels = new(T) if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking wheels.setDir(spawn_chair.dir) wheels.buckle_mob(quirk_holder) // During the spawning process, they may have dropped what they were holding, due to the paralysis // So put the things back in their hands. for(var/obj/item/I in T) if(I.fingerprintslast == quirk_holder.ckey) quirk_holder.put_in_hands(I) /datum/quirk/poor_aim name = "Poor Aim" desc = "You're terrible with guns and can't line up a straight shot to save your life. Dual-wielding is right out." value = -1 mob_trait = TRAIT_POOR_AIM medical_record_text = "Patient possesses a strong tremor in both hands." /datum/quirk/prosopagnosia name = "Prosopagnosia" desc = "You have a mental disorder that prevents you from being able to recognize faces at all." value = -1 mob_trait = TRAIT_PROSOPAGNOSIA medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." /datum/quirk/prosthetic_limb name = "Prosthetic Limb" desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" value = -1 var/slot_string = "limb" medical_record_text = "During physical examination, patient was found to have a prosthetic limb." /datum/quirk/prosthetic_limb/on_spawn() var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/mob/living/carbon/human/H = quirk_holder var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot) var/obj/item/bodypart/prosthetic switch(limb_slot) if(BODY_ZONE_L_ARM) prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(quirk_holder) slot_string = "left arm" if(BODY_ZONE_R_ARM) prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(quirk_holder) slot_string = "right arm" if(BODY_ZONE_L_LEG) prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(quirk_holder) slot_string = "left leg" if(BODY_ZONE_R_LEG) prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder) slot_string = "right leg" prosthetic.replace_limb(H) qdel(old_part) H.regenerate_icons() /datum/quirk/prosthetic_limb/post_add() to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.") /datum/quirk/insanity name = "Reality Dissociation Syndrome" desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. This is not a license to grief." value = -2 //no mob trait because it's handled uniquely gain_text = "..." lose_text = "You feel in tune with the world again." medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." /datum/quirk/insanity/on_process() if(quirk_holder.reagents.has_reagent("mindbreaker")) quirk_holder.hallucination = 0 return if(prob(2)) //we'll all be mad soon enough madness() /datum/quirk/insanity/proc/madness() quirk_holder.hallucination += rand(10, 25) /datum/quirk/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have if(!quirk_holder.mind || quirk_holder.mind.special_role) return to_chat(quirk_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \ the round. You are not an antagonist, and the rules will treat you the same as other crewmembers.") /datum/quirk/social_anxiety name = "Social Anxiety" desc = "Talking to people is very difficult for you, and you often stutter or even lock up." value = -1 gain_text = "You start worrying about what you're saying." lose_text = "You feel easier about talking again." //if only it were that easy! medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them." var/dumb_thing = TRUE /datum/quirk/social_anxiety/on_process() var/nearby_people = 0 for(var/mob/living/carbon/human/H in oview(3, quirk_holder)) if(H.client) nearby_people++ var/mob/living/carbon/human/H = quirk_holder if(prob(2 + nearby_people)) H.stuttering = max(3, H.stuttering) else if(prob(min(3, nearby_people)) && !H.silent) to_chat(H, "You retreat into yourself. You really don't feel up to talking.") H.silent = max(10, H.silent) else if(prob(0.5) && dumb_thing) to_chat(H, "You think of a dumb thing you said a long time ago and scream internally.") dumb_thing = FALSE //only once per life if(prob(1)) new/obj/item/reagent_containers/food/snacks/spaghetti/pastatomato(get_turf(H)) //now that's what I call spaghetti code //If you want to make some kind of junkie variant, just extend this quirk. /datum/quirk/junkie name = "Junkie" desc = "You can't get enough of hard drugs." value = -2 gain_text = "You suddenly feel the craving for drugs." lose_text = "You feel like you should kick your drug habit." medical_record_text = "Patient has a history of hard drugs." var/drug_list = list("crank", "krokodil", "morphine", "happiness", "methamphetamine") //List of possible IDs var/reagent_id //ID picked from list var/datum/reagent/reagent_type //If this is defined, reagent_id will be unused and the defined reagent type will be instead. var/datum/reagent/reagent_instance var/where_drug var/obj/item/drug_container_type //If this is defined before pill generation, pill generation will be skipped. This is the type of the pill bottle. var/obj/item/drug_instance var/where_accessory var/obj/item/accessory_type //If this is null, it won't be spawned. var/obj/item/accessory_instance var/tick_counter = 0 /datum/quirk/junkie/on_spawn() var/mob/living/carbon/human/H = quirk_holder reagent_id = pick(drug_list) if (!reagent_type) var/datum/reagent/prot_holder = GLOB.chemical_reagents_list[reagent_id] reagent_type = prot_holder.type reagent_instance = new reagent_type() H.reagents.addiction_list.Add(reagent_instance) var/current_turf = get_turf(quirk_holder) if (!drug_container_type) drug_container_type = /obj/item/storage/pill_bottle drug_instance = new drug_container_type(current_turf) if (istype(drug_instance, /obj/item/storage/pill_bottle)) var/pill_state = "pill[rand(1,20)]" for(var/i in 1 to 7) var/obj/item/reagent_containers/pill/P = new(drug_instance) P.icon_state = pill_state P.reagents.add_reagent(reagent_id, 1) if (accessory_type) accessory_instance = new accessory_type(current_turf) var/list/slots = list( "in your left pocket" = SLOT_L_STORE, "in your right pocket" = SLOT_R_STORE, "in your backpack" = SLOT_IN_BACKPACK ) where_drug = H.equip_in_one_of_slots(drug_instance, slots, FALSE) || "at your feet" if (accessory_instance) where_accessory = H.equip_in_one_of_slots(accessory_instance, slots, FALSE) || "at your feet" announce_drugs() /datum/quirk/junkie/post_add() if(where_drug == "in your backpack" || where_accessory == "in your backpack") var/mob/living/carbon/human/H = quirk_holder SEND_SIGNAL(H.back, COMSIG_TRY_STORAGE_SHOW, H) /datum/quirk/junkie/proc/announce_drugs() to_chat(quirk_holder, "There is a [drug_instance.name] of [reagent_instance.name] [where_drug]. Better hope you don't run out...") /datum/quirk/junkie/on_process() var/mob/living/carbon/human/H = quirk_holder if (tick_counter == 60) //Halfassed optimization, increase this if there's slowdown due to this quirk var/in_list = FALSE for (var/datum/reagent/entry in H.reagents.addiction_list) if(istype(entry, reagent_type)) in_list = TRUE break if(!in_list) H.reagents.addiction_list += reagent_instance reagent_instance.addiction_stage = 0 to_chat(quirk_holder, "You thought you kicked it, but you suddenly feel like you need [reagent_instance.name] again...") tick_counter = 0 else ++tick_counter /datum/quirk/junkie/smoker name = "Smoker" desc = "Sometimes you just really want a smoke. Probably not great for your lungs." value = -1 gain_text = "You could really go for a smoke right about now." lose_text = "You feel like you should quit smoking." medical_record_text = "Patient is a current smoker." reagent_type = /datum/reagent/drug/nicotine accessory_type = /obj/item/lighter/greyscale /datum/quirk/junkie/smoker/on_spawn() drug_container_type = pick(/obj/item/storage/fancy/cigarettes, /obj/item/storage/fancy/cigarettes/cigpack_midori, /obj/item/storage/fancy/cigarettes/cigpack_uplift, /obj/item/storage/fancy/cigarettes/cigpack_robust, /obj/item/storage/fancy/cigarettes/cigpack_robustgold, /obj/item/storage/fancy/cigarettes/cigpack_carp, /obj/item/storage/fancy/cigarettes/cigars, /obj/item/storage/fancy/cigarettes/cigars/cohiba, /obj/item/storage/fancy/cigarettes/cigars/havana) . = ..() /datum/quirk/junkie/smoker/announce_drugs() to_chat(quirk_holder, "There is a [drug_instance.name] [where_drug], and a lighter [where_accessory]. Make sure you get your favorite brand when you run out.") /datum/quirk/junkie/smoker/on_process() . = ..() var/mob/living/carbon/human/H = quirk_holder var/obj/item/I = H.get_item_by_slot(SLOT_WEAR_MASK) if (istype(I, /obj/item/clothing/mask/cigarette)) var/obj/item/storage/fancy/cigarettes/C = drug_instance if(istype(I, C.spawn_type)) SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "wrong_cigs") return SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "wrong_cigs", /datum/mood_event/wrong_brand) /datum/quirk/unstable name = "Unstable" desc = "Due to past troubles, you are unable to recover your sanity if you lose it. Be very careful managing your mood!" value = -2 mob_trait = TRAIT_UNSTABLE gain_text = "There's a lot on your mind right now." lose_text = "Your mind finally feels calm." medical_record_text = "Patient's mind is in a vulnerable state, and cannot recover from traumatic events."