From 988dbe87da610f681b7e271a17849df4dfb9451a Mon Sep 17 00:00:00 2001 From: XDTM Date: Wed, 6 Dec 2017 19:04:17 +0100 Subject: [PATCH] Brain Traumas --- code/__DEFINES/DNA.dm | 7 +- code/__DEFINES/misc.dm | 3 + code/__DEFINES/mobs.dm | 11 + code/__DEFINES/stat.dm | 36 +++ code/_onclick/item_attack.dm | 4 +- code/controllers/subsystem/traumas.dm | 52 +++++ code/datums/brain_damage/brain_trauma.dm | 49 ++++ code/datums/brain_damage/mild.dm | 135 +++++++++++ code/datums/brain_damage/phobia.dm | 115 +++++++++ code/datums/brain_damage/severe.dm | 179 ++++++++++++++ code/datums/brain_damage/special.dm | 114 +++++++++ code/datums/brain_damage/split_personality.dm | 218 ++++++++++++++++++ code/datums/datumvars.dm | 36 +++ .../diseases/advance/symptoms/confusion.dm | 4 +- .../diseases/advance/symptoms/sensory.dm | 13 ++ code/datums/diseases/brainrot.dm | 10 +- code/datums/martial/cqc.dm | 2 +- code/datums/martial/psychotic_brawl.dm | 68 ++++++ code/datums/martial/sleeping_carp.dm | 2 +- code/datums/mutations/speech.dm | 8 +- .../abduction/machinery/experiment.dm | 1 + code/game/machinery/doors/airlock.dm | 2 +- .../mecha/equipment/tools/medical_tools.dm | 1 + .../temporary_visuals/miscellaneous.dm | 5 + code/game/objects/items/RCD.dm | 4 - code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/devices/scanners.dm | 21 +- code/game/objects/items/dna_injector.dm | 12 +- code/game/objects/items/storage/book.dm | 2 +- code/modules/admin/secrets.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/assembly/mousetrap.dm | 145 ++++++++++++ code/modules/flufftext/Hallucination.dm | 12 +- .../jobs/job_types/civilian_chaplain.dm | 2 +- code/modules/mob/living/brain/brain_item.dm | 82 +++++++ code/modules/mob/living/brain/status_procs.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 6 +- .../mob/living/carbon/carbon_defense.dm | 2 +- .../modules/mob/living/carbon/damage_procs.dm | 34 +++ code/modules/mob/living/carbon/examine.dm | 2 +- .../mob/living/carbon/human/examine.dm | 4 +- .../mob/living/carbon/human/human_helpers.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 12 +- .../mob/living/carbon/human/species.dm | 10 +- .../mob/living/carbon/human/status_procs.dm | 4 +- code/modules/mob/living/carbon/life.dm | 25 ++ code/modules/mob/living/carbon/say.dm | 14 ++ .../modules/mob/living/carbon/status_procs.dm | 32 +++ code/modules/mob/living/damage_procs.dm | 12 +- code/modules/mob/living/living_defines.dm | 1 - code/modules/mob/living/say.dm | 4 +- code/modules/mob/login.dm | 9 + code/modules/mob/mob.dm | 1 + code/modules/mob/mob_defines.dm | 1 + code/modules/mob/transform_procs.dm | 6 + code/modules/paperwork/contract.dm | 7 +- .../chemistry/reagents/drug_reagents.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 13 +- .../chemistry/reagents/other_reagents.dm | 8 +- .../chemistry/reagents/toxin_reagents.dm | 7 +- .../spells/spell_types/voice_of_god.dm | 3 +- code/modules/surgery/brain_surgery.dm | 42 ++++ code/modules/surgery/eye_surgery.dm | 3 +- code/modules/surgery/organs/heart.dm | 10 +- code/modules/surgery/organs/lungs.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 5 +- code/modules/tgui/states/default.dm | 3 - icons/effects/effects.dmi | Bin 864549 -> 873863 bytes icons/mob/simple_human.dmi | Bin 77637 -> 79339 bytes strings/phobia.json | 63 +++++ tgstation.dme | 9 + 73 files changed, 1622 insertions(+), 105 deletions(-) create mode 100644 code/controllers/subsystem/traumas.dm create mode 100644 code/datums/brain_damage/brain_trauma.dm create mode 100644 code/datums/brain_damage/mild.dm create mode 100644 code/datums/brain_damage/phobia.dm create mode 100644 code/datums/brain_damage/severe.dm create mode 100644 code/datums/brain_damage/special.dm create mode 100644 code/datums/brain_damage/split_personality.dm create mode 100644 code/datums/martial/psychotic_brawl.dm create mode 100644 code/modules/surgery/brain_surgery.dm create mode 100644 strings/phobia.json diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index d3dd3fabe3..5297fb9835 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -24,7 +24,7 @@ #define MUT_MUTE "Mute" #define SMILE "Smile" #define STONER "Stoner" -#define UNINTELLIGABLE "Unintelligable" +#define UNINTELLIGIBLE "Unintelligible" #define SWEDISH "Swedish" #define CHAV "Chav" #define ELVIS "Elvis" @@ -69,6 +69,7 @@ #define DNA_GENDER_BLOCK 5 #define DNA_FACIAL_HAIR_STYLE_BLOCK 6 #define DNA_HAIR_STYLE_BLOCK 7 +<<<<<<< HEAD #define DNA_EYE_COLOR_TWO_BLOCK 8 #define DNA_EYE_COLOR_SWITCH_BLOCK 9 #define DNA_EYE_COLOR_BLOCK 10 @@ -83,6 +84,10 @@ #define DNA_MUTANTWING_BLOCK 18 #define DNA_WINGCOLOR_BLOCK 19 #define DNA_STRUC_ENZYMES_BLOCKS 19 +======= + +#define DNA_STRUC_ENZYMES_BLOCKS 18 +>>>>>>> 550d711... Brain Traumas (#31727) #define DNA_UNIQUE_ENZYMES_LEN 32 //Transformation proc stuff diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index f5cb701290..fdc63d1df6 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -491,6 +491,9 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define RIDING_OFFSET_ALL "ALL" +//text files +#define BRAIN_DAMAGE_FILE "brain_damage_lines.json" + //Fullscreen overlay resolution in tiles. #define FULLSCREEN_OVERLAY_RESOLUTION_X 15 #define FULLSCREEN_OVERLAY_RESOLUTION_Y 15 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 69596e7a0f..49e3c996fe 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -51,6 +51,17 @@ #define DEVIL_BODYPART "devil" /*see __DEFINES/inventory.dm for bodypart bitflag defines*/ +//Brain Damage defines +#define BRAIN_DAMAGE_MILD 50 +#define BRAIN_DAMAGE_SEVERE 120 +#define BRAIN_DAMAGE_DEATH 200 + +#define BRAIN_TRAUMA_MILD /datum/brain_trauma/mild +#define BRAIN_TRAUMA_SEVERE /datum/brain_trauma/severe +#define BRAIN_TRAUMA_SPECIAL /datum/brain_trauma/special + +#define BRAIN_DAMAGE_INTEGRITY_MULTIPLIER 0.5 + //Health hud screws for carbon mobs #define SCREWYHUD_NONE 0 #define SCREWYHUD_CRIT 1 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 5dbe99a9c5..df295f6e12 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /* Used with the various stat variables (mob, machines) */ @@ -29,3 +30,38 @@ #define POWER_REQ_NONE 0 #define POWER_REQ_ALL 1 #define POWER_REQ_CLOCKCULT 2 +======= +/* + Used with the various stat variables (mob, machines) +*/ + +//mob/var/stat things +#define CONSCIOUS 0 +#define SOFT_CRIT 1 +#define UNCONSCIOUS 2 +#define DEAD 3 + +//mob disabilities stat + +#define BLIND 1 +#define MUTE 2 +#define DEAF 4 +#define NEARSIGHT 8 +#define FAT 32 +#define HUSK 64 +#define NOCLONE 128 +#define CLUMSY 256 +#define DUMB 512 +#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE + +// bitflags for machine stat variable +#define BROKEN 1 +#define NOPOWER 2 +#define MAINT 4 // under maintaince +#define EMPED 8 // temporary broken by EMP pulse + +//ai power requirement defines +#define POWER_REQ_NONE 0 +#define POWER_REQ_ALL 1 +#define POWER_REQ_CLOCKCULT 2 +>>>>>>> 550d711... Brain Traumas (#31727) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 56cd1d8e4c..859c957a43 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -135,6 +135,6 @@ var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]." if(user in viewers(src, null)) attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!" - visible_message("[attack_message]", \ + visible_message("[attack_message]",\ "[attack_message]", null, COMBAT_MESSAGE_RANGE) - return 1 \ No newline at end of file + return 1 diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm new file mode 100644 index 0000000000..14f15a4b89 --- /dev/null +++ b/code/controllers/subsystem/traumas.dm @@ -0,0 +1,52 @@ +SUBSYSTEM_DEF(traumas) + name = "Traumas" + flags = SS_NO_FIRE + var/list/phobia_types + var/list/phobia_words + var/list/phobia_mobs + var/list/phobia_objs + var/list/phobia_turfs + var/list/phobia_species + +#define PHOBIA_FILE "phobia.json" + +/datum/controller/subsystem/traumas/Initialize() + phobia_types = list("spiders", "space", "security", "clowns", "greytide", "lizards", "skeletons") + + phobia_words = list("spiders" = strings(PHOBIA_FILE, "spiders"), + "space" = strings(PHOBIA_FILE, "space"), + "security" = strings(PHOBIA_FILE, "security"), + "clowns" = strings(PHOBIA_FILE, "clowns"), + "greytide" = strings(PHOBIA_FILE, "greytide"), + "lizards" = strings(PHOBIA_FILE, "lizards"), + "skeletons" = strings(PHOBIA_FILE, "skeletons"), + ) + + phobia_mobs = list("spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)), + "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), + "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)) + ) + + phobia_objs = list("spiders" = typecacheof(list(/obj/structure/spider)), + "security" = typecacheof(list(/obj/item/clothing/under/rank/security, /obj/item/clothing/under/rank/warden, + /obj/item/clothing/under/rank/head_of_security, /obj/item/clothing/under/rank/det, + /obj/item/melee/baton, /obj/item/gun/energy/taser, /obj/item/restraints/handcuffs, + /obj/machinery/door/airlock/security)), + "clowns" = typecacheof(list(/obj/item/clothing/under/rank/clown, /obj/item/clothing/shoes/clown_shoes, + /obj/item/clothing/mask/gas/clown_hat, /obj/item/device/instrument/bikehorn, + /obj/item/device/pda/clown, /obj/item/grown/bananapeel)), + "greytide" = typecacheof(list(/obj/item/clothing/under/color/grey, /obj/item/melee/baton/cattleprod, + /obj/item/twohanded/spear, /obj/item/clothing/mask/gas)), + "lizards" = typecacheof(list(/obj/item/toy/plush/lizardplushie, /obj/item/reagent_containers/food/snacks/kebab/tail, + /obj/item/organ/tail/lizard, /obj/item/reagent_containers/food/drinks/bottle/lizardwine)), + "skeletons" = typecacheof(list(/obj/item/organ/tongue/bone, /obj/item/clothing/suit/armor/bone, /obj/item/stack/sheet/bone, + /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton, + /obj/effect/decal/remains/human)) + ) + phobia_turfs = list("space" = typecacheof(list(/turf/open/space, /turf/open/floor/holofloor/space, /turf/open/floor/fakespace))) + + phobia_species = list("lizards" = typecacheof(list(/datum/species/lizard)), + "skeletons" = typecacheof(list(/datum/species/skeleton, /datum/species/plasmaman)) + ) + +#undef PHOBIA_FILE diff --git a/code/datums/brain_damage/brain_trauma.dm b/code/datums/brain_damage/brain_trauma.dm new file mode 100644 index 0000000000..53b0fbe056 --- /dev/null +++ b/code/datums/brain_damage/brain_trauma.dm @@ -0,0 +1,49 @@ +//Brain Traumas are the new actual brain damage. Brain damage itself acts as a way to acquire traumas: every time brain damage is dealt, there's a chance of receiving a trauma. +//This chance gets higher the higher the mob's brainloss is. Removing traumas is a separate thing from removing brain damage: you can get restored to full brain operativity, +//but keep the quirks, until repaired by mannitol (for mild/special ones) or brain surgery (for severe ones). +/datum/brain_trauma + var/name = "Brain Trauma" + var/desc = "A trauma caused by brain damage, which causes issues to the patient." + var/scan_desc = "a generic brain trauma" //description when detected by a health scanner + var/mob/living/carbon/owner //the poor bastard + var/obj/item/organ/brain/brain //the poor bastard's brain + var/gain_text = "You feel traumatized." + var/lose_text = "You no longer feel traumatized." + var/can_gain = TRUE //can this be gained through random traumas? + var/permanent = FALSE //can this be cured? + +/datum/brain_trauma/New(obj/item/organ/brain/B, _permanent) + brain = B + owner = B.owner + permanent = _permanent + if(owner) + on_gain() + +/datum/brain_trauma/Destroy() + brain.traumas -= src + if(owner) + on_lose() + brain = null + owner = null + return ..() + +//Called on life ticks +/datum/brain_trauma/proc/on_life() + return + +//Called when given to a mob +/datum/brain_trauma/proc/on_gain() + to_chat(owner, gain_text) + +//Called when removed from a mob +/datum/brain_trauma/proc/on_lose(silent) + if(!silent) + to_chat(owner, lose_text) + +//Called when hearing a spoken message +/datum/brain_trauma/proc/on_hear(message, speaker, message_language, raw_message, radio_freq) + return message + +//Called when speaking +/datum/brain_trauma/proc/on_say(message) + return message diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm new file mode 100644 index 0000000000..6bfa149aa7 --- /dev/null +++ b/code/datums/brain_damage/mild.dm @@ -0,0 +1,135 @@ +//Mild traumas are the most common; they are generally minor annoyances. +//They can be cured with mannitol and patience, although brain surgery still works. +//Most of the old brain damage effects have been transferred to the dumbness trauma. + +/datum/brain_trauma/mild + +/datum/brain_trauma/mild/hallucinations + name = "Hallucinations" + desc = "Patient suffers constant hallucinations." + scan_desc = "schizophrenia" + gain_text = "You feel your grip on reality slipping..." + lose_text = "You feel more grounded." + +/datum/brain_trauma/mild/hallucinations/on_life() + owner.hallucination = min(owner.hallucination + 10, 50) + ..() + +/datum/brain_trauma/mild/hallucinations/on_lose() + owner.hallucination = 0 + ..() + +/datum/brain_trauma/mild/stuttering + name = "Stuttering" + desc = "Patient can't speak properly." + scan_desc = "reduced mouth coordination" + gain_text = "Speaking clearly is getting harder." + lose_text = "You feel in control of your speech." + +/datum/brain_trauma/mild/stuttering/on_life() + owner.stuttering = min(owner.stuttering + 5, 25) + ..() + +/datum/brain_trauma/mild/stuttering/on_lose() + owner.stuttering = 0 + ..() + +/datum/brain_trauma/mild/dumbness + name = "Dumbness" + desc = "Patient has reduced brain activity, making them less intelligent." + scan_desc = "reduced brain activity" + gain_text = "You feel dumber." + lose_text = "You feel smart again." + +/datum/brain_trauma/mild/dumbness/on_gain() + owner.disabilities |= DUMB + ..() + +/datum/brain_trauma/mild/dumbness/on_life() + owner.derpspeech = min(owner.derpspeech + 5, 25) + if(prob(3)) + owner.emote("drool") + else if(owner.stat == CONSCIOUS && prob(3)) + owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")) + ..() + +/datum/brain_trauma/mild/dumbness/on_lose() + owner.disabilities &= ~DUMB + owner.derpspeech = 0 + ..() + +/datum/brain_trauma/mild/speech_impediment + name = "Speech Impediment" + desc = "Patient is unable to form coherent sentences." + scan_desc = "communication disorder" + gain_text = "" //mutation will handle the text + lose_text = "" + +/datum/brain_trauma/mild/speech_impediment/on_gain() + owner.dna.add_mutation(UNINTELLIGIBLE) + ..() + +//no fiddling with genetics to get out of this one +/datum/brain_trauma/mild/speech_impediment/on_life() + if(!(GLOB.mutations_list[UNINTELLIGIBLE] in owner.dna.mutations)) + on_gain() + ..() + +/datum/brain_trauma/mild/speech_impediment/on_lose() + owner.dna.remove_mutation(UNINTELLIGIBLE) + ..() + +/datum/brain_trauma/mild/concussion + name = "Concussion" + desc = "Patient's brain is concussed." + scan_desc = "a concussion" + gain_text = "Your head hurts!" + lose_text = "The pressure inside your head starts fading." + +/datum/brain_trauma/mild/concussion/on_life() + if(prob(5)) + switch(rand(1,11)) + if(1) + owner.vomit() + if(2,3) + owner.dizziness += 10 + if(4,5) + owner.confused += 10 + owner.blur_eyes(10) + if(6 to 9) + owner.slurring += 30 + if(10) + to_chat(owner, "You forget for a moment what you were doing.") + owner.Stun(20) + if(11) + to_chat(owner, "You faint.") + owner.Unconscious(80) + + ..() + +/datum/brain_trauma/mild/muscle_weakness + name = "Muscle Weakness" + desc = "Patient experiences occasional bouts of muscle weakness." + scan_desc = "weak motor nerve signal" + gain_text = "Your muscles feel oddly faint." + lose_text = "You feel in control of your muscles again." + +/datum/brain_trauma/mild/muscle_weakness/on_life() + var/fall_chance = 1 + if(owner.m_intent == MOVE_INTENT_RUN) + fall_chance += 2 + if(prob(fall_chance) && !owner.lying && !owner.buckled) + to_chat(owner, "Your leg gives out!") + owner.Knockdown(35) + + else if(owner.get_active_held_item()) + var/drop_chance = 1 + var/obj/item/I = owner.get_active_held_item() + drop_chance += I.w_class + if(prob(drop_chance) && owner.dropItemToGround(I)) + to_chat(owner, "You drop [I]!") + + else if(prob(3)) + to_chat(owner, "You feel a sudden weakness in your muscles!") + owner.adjustStaminaLoss(50) + ..() diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm new file mode 100644 index 0000000000..313b693436 --- /dev/null +++ b/code/datums/brain_damage/phobia.dm @@ -0,0 +1,115 @@ +/datum/brain_trauma/mild/phobia + name = "Phobia" + desc = "Patient is unreasonably afraid of something." + scan_desc = "phobia" + gain_text = "" + lose_text = "" + var/phobia_type + var/next_check = 0 + var/next_scare = 0 + var/list/trigger_words + //instead of cycling every atom, only cycle the relevant types + var/list/trigger_mobs + var/list/trigger_objs //also checked in mob equipment + var/list/trigger_turfs + var/list/trigger_species + +/datum/brain_trauma/mild/phobia/New(mob/living/carbon/C, _permanent, specific_type) + phobia_type = specific_type + if(!phobia_type) + phobia_type = pick(SStraumas.phobia_types) + + gain_text = "You start finding [phobia_type] very unnerving..." + lose_text = "You no longer feel afraid of [phobia_type]." + scan_desc += " of [phobia_type]" + trigger_words = SStraumas.phobia_words[phobia_type] + trigger_mobs = SStraumas.phobia_mobs[phobia_type] + trigger_objs = SStraumas.phobia_objs[phobia_type] + trigger_turfs = SStraumas.phobia_turfs[phobia_type] + trigger_species = SStraumas.phobia_species[phobia_type] + ..() + +/datum/brain_trauma/mild/phobia/on_life() + ..() + if(owner.eye_blind) + return + if(world.time > next_check && world.time > next_scare) + next_check = world.time + 50 + var/list/seen_atoms = view(7, owner) + + if(LAZYLEN(trigger_objs)) + for(var/obj/O in seen_atoms) + if(is_type_in_typecache(O, trigger_objs)) + freak_out(O) + return + + if(LAZYLEN(trigger_turfs)) + for(var/turf/T in seen_atoms) + if(is_type_in_typecache(T, trigger_turfs)) + freak_out(T) + return + + if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_objs)) + for(var/mob/M in seen_atoms) + if(is_type_in_typecache(M, trigger_mobs)) + freak_out(M) + return + + else if(ishuman(M)) //check their equipment for trigger items + var/mob/living/carbon/human/H = M + + if(LAZYLEN(trigger_species) && H.dna && H.dna.species && is_type_in_typecache(H.dna.species, trigger_species)) + freak_out(H) + + for(var/X in H.get_all_slots() | H.held_items) + var/obj/I = X + if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs)) + freak_out(I) + return + +/datum/brain_trauma/mild/phobia/on_hear(message, speaker, message_language, raw_message, radio_freq) + if(owner.disabilities & DEAF || world.time < next_scare) //words can't trigger you if you can't hear them *taps head* + return message + for(var/word in trigger_words) + if(findtext(message, word)) + addtimer(CALLBACK(src, .proc/freak_out, null, word), 10) //to react AFTER the chat message + break + return message + +/datum/brain_trauma/mild/phobia/on_say(message) + for(var/word in trigger_words) + if(findtext(message, word)) + to_chat(owner, "You can't bring yourself to say the word \"[word]\"!") + return "" + return message + +/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) + next_scare = world.time + 120 + var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine") + if(reason) + to_chat(owner, "Seeing [reason] [message]!") + else if(trigger_word) + to_chat(owner, "Hearing \"[trigger_word]\" [message]!") + else + to_chat(owner, "Something [message]!") + var/reaction = rand(1,4) + switch(reaction) + if(1) + to_chat(owner, "You are paralyzed with fear!") + owner.Stun(70) + owner.Jitter(8) + if(2) + owner.emote("scream") + owner.Jitter(5) + owner.say("AAAAH!!") + if(reason) + owner.pointed(reason) + if(3) + to_chat(owner, "You shut your eyes in terror!") + owner.Jitter(5) + owner.blind_eyes(10) + if(4) + owner.dizziness += 10 + owner.confused += 10 + owner.Jitter(10) + owner.stuttering += 10 \ No newline at end of file diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm new file mode 100644 index 0000000000..505112bdcf --- /dev/null +++ b/code/datums/brain_damage/severe.dm @@ -0,0 +1,179 @@ +//Severe traumas, when your brain gets abused way too much. +//These range from very annoying to completely debilitating. +//They cannot be cured with chemicals, and require brain surgery to solve. + +/datum/brain_trauma/severe + +/datum/brain_trauma/severe/mute + name = "Mutism" + desc = "Patient is completely unable to speak." + scan_desc = "extensive damage to the brain's language center" + gain_text = "You forget how to speak!" + lose_text = "You suddenly remember how to speak." + +/datum/brain_trauma/severe/mute/on_gain() + owner.disabilities |= MUTE + ..() + +//no fiddling with genetics to get out of this one +/datum/brain_trauma/severe/mute/on_life() + if(!(owner.disabilities & MUTE)) + on_gain() + ..() + +/datum/brain_trauma/severe/mute/on_lose() + owner.disabilities &= ~MUTE + ..() + +/datum/brain_trauma/severe/blindness + name = "Cerebral Blindness" + desc = "Patient's brain is no longer connected to its eyes." + scan_desc = "extensive damage to the brain's frontal lobe" + gain_text = "You can't see!" + lose_text = "Your vision returns." + +/datum/brain_trauma/severe/blindness/on_gain() + owner.become_blind() + ..() + +//no fiddling with genetics to get out of this one +/datum/brain_trauma/severe/blindness/on_life() + if(!(owner.disabilities & BLIND)) + on_gain() + ..() + +/datum/brain_trauma/severe/blindness/on_lose() + owner.cure_blind() + ..() + +/datum/brain_trauma/severe/paralysis + name = "Paralysis" + desc = "Patient's brain can no longer control its motor functions." + scan_desc = "cerebral paralysis" + gain_text = "You can't feel your body anymore!" + lose_text = "You can feel your limbs again!" + +/datum/brain_trauma/severe/paralysis/on_life() + owner.Knockdown(200, ignore_canknockdown = TRUE) + ..() + +/datum/brain_trauma/severe/paralysis/on_lose() + owner.SetKnockdown(0) + ..() + +/datum/brain_trauma/severe/narcolepsy + name = "Narcolepsy" + desc = "Patient may involuntarily fall asleep during normal activities." + scan_desc = "traumatic narcolepsy" + gain_text = "You have a constant feeling of drowsiness..." + lose_text = "You feel awake and aware again." + +/datum/brain_trauma/severe/narcolepsy/on_life() + ..() + if(owner.IsSleeping()) + return + var/sleep_chance = 1 + if(owner.m_intent == MOVE_INTENT_RUN) + sleep_chance += 2 + if(owner.drowsyness) + sleep_chance += 3 + if(prob(sleep_chance)) + to_chat(owner, "You fall asleep.") + owner.Sleeping(60) + else if(!owner.drowsyness && prob(sleep_chance * 2)) + to_chat(owner, "You feel tired...") + owner.drowsyness += 10 + +/datum/brain_trauma/severe/monophobia + name = "Monophobia" + desc = "Patient feels sick and distressed when not around other people, leading to potentially lethal levels of stress." + scan_desc = "severe monophobia" + gain_text = "" + lose_text = "You feel like you could be safe on your own." + var/stress = 0 + +/datum/brain_trauma/severe/monophobia/on_gain() + ..() + if(check_alone()) + to_chat(owner, "You feel really lonely...") + else + to_chat(owner, "You feel safe, as long as you have people around you.") + +/datum/brain_trauma/severe/monophobia/on_life() + ..() + if(check_alone()) + stress = min(stress + 0.5, 100) + if(stress > 10 && (prob(5))) + stress_reaction() + else + stress -= 4 + +/datum/brain_trauma/severe/monophobia/proc/check_alone() + if(owner.disabilities & BLIND) + return TRUE + for(var/mob/M in oview(owner, 7)) + if(!isliving(M)) //ghosts ain't people + continue + if((istype(M, /mob/living/simple_animal/pet)) || M.ckey) + return FALSE + return TRUE + +/datum/brain_trauma/severe/monophobia/proc/stress_reaction() + if(owner.stat != CONSCIOUS) + return + + var/high_stress = (stress > 60) //things get psychosomatic from here on + switch(rand(1,6)) + if(1) + if(!high_stress) + to_chat(owner, "You feel sick...") + else + to_chat(owner, "You feel really sick at the thought of being alone!") + addtimer(CALLBACK(owner, /mob/living/carbon.proc/vomit, high_stress), 50) //blood vomit if high stress + if(2) + if(!high_stress) + to_chat(owner, "You can't stop shaking...") + owner.dizziness += 20 + owner.confused += 20 + owner.Jitter(20) + else + to_chat(owner, "You feel weak and scared! If only you weren't alone...") + owner.dizziness += 20 + owner.confused += 20 + owner.Jitter(20) + owner.adjustStaminaLoss(50) + + if(3, 4) + if(!high_stress) + to_chat(owner, "You feel really lonely...") + else + to_chat(owner, "You're going mad with loneliness!") + owner.hallucination += 20 + + if(5) + if(!high_stress) + to_chat(owner, "Your heart skips a beat.") + owner.adjustOxyLoss(8) + else + if(prob(15) && ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.set_heartattack(TRUE) + to_chat(H, "You feel a stabbing pain in your heart!") + else + to_chat(owner, "You feel your heart lurching in your chest...") + owner.adjustOxyLoss(8) + +/datum/brain_trauma/severe/discoordination + name = "Discoordination" + desc = "Patient is unable to use complex tools or machinery." + scan_desc = "extreme discoordination" + gain_text = "You can barely control your hands!" + lose_text = "You feel in control of your hands again." + +/datum/brain_trauma/severe/discoordination/on_gain() + owner.disabilities |= MONKEYLIKE + ..() + +/datum/brain_trauma/severe/discoordination/on_lose() + owner.disabilities &= ~MONKEYLIKE + ..() diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm new file mode 100644 index 0000000000..fd7aa1445d --- /dev/null +++ b/code/datums/brain_damage/special.dm @@ -0,0 +1,114 @@ +//Brain traumas that are rare and/or somewhat beneficial; +//they are the easiest to cure, which means that if you want +//to keep them, you can't cure your other traumas +/datum/brain_trauma/special + +/datum/brain_trauma/special/godwoken + name = "Godwoken Syndrome" + desc = "Patient occasionally and uncontrollably channels an eldritch god when speaking." + scan_desc = "god delusion" + gain_text = "You feel a higher power inside your mind..." + lose_text = "The divine presence leaves your head, no longer interested." + var/next_speech = 0 + +/datum/brain_trauma/special/godwoken/on_say(message) + if(world.time > next_speech && prob(10)) + playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5) + var/cooldown = voice_of_god(message, owner, list("colossus","yell"), 2) + cooldown *= 0.33 + next_speech = world.time + cooldown + return "" + else + return message + +/datum/brain_trauma/special/bluespace_prophet + name = "Bluespace Prophecy" + desc = "Patient can sense the bob and weave of bluespace around them, showing them passageways no one else can see." + scan_desc = "bluespace attunement" + gain_text = "You feel the bluespace pulsing around you..." + lose_text = "The faint pulsing of bluespace fades into silence." + var/next_portal = 0 + +/datum/brain_trauma/special/bluespace_prophet/on_life() + if(world.time > next_portal) + next_portal = world.time + 100 + var/list/turf/possible_turfs = list() + for(var/turf/T in range(owner, 8)) + if(!T.density) + var/clear = TRUE + for(var/obj/O in T) + if(O.density) + clear = FALSE + break + if(clear) + possible_turfs += T + + if(!LAZYLEN(possible_turfs)) + return + + var/turf/first_turf = pick(possible_turfs) + if(!first_turf) + return + + possible_turfs -= (possible_turfs & range(first_turf, 3)) + + var/turf/second_turf = pick(possible_turfs) + if(!second_turf) + return + + var/obj/effect/hallucination/simple/bluespace_stream/first = new(first_turf, owner) + var/obj/effect/hallucination/simple/bluespace_stream/second = new(second_turf, owner) + + first.linked_to = second + second.linked_to = first + first.seer = owner + second.seer = owner + +/obj/effect/hallucination/simple/bluespace_stream + name = "bluespace stream" + desc = "You see a hidden pathway through bluespace..." + image_icon = 'icons/effects/effects.dmi' + image_state = "bluestream" + image_layer = ABOVE_MOB_LAYER + var/obj/effect/hallucination/simple/bluespace_stream/linked_to + var/mob/living/carbon/seer + +/obj/effect/hallucination/simple/bluespace_stream/Initialize() + . = ..() + QDEL_IN(src, 300) + +/obj/effect/hallucination/simple/bluespace_stream/attack_hand(mob/user) + if(user != seer || !linked_to) + return + var/slip_in_message = pick("slides sideways in an odd way, and disappears", "jumps into an unseen dimension",\ + "sticks one leg straight out, wiggles [user.p_their()] foot, and is suddenly gone", "stops, then blinks out of reality", \ + "is pulled into an invisible vortex, vanishing from sight") + var/slip_out_message = pick("silently fades in", "leaps out of thin air","appears", "walks out of an invisible doorway",\ + "slides out of a fold in spacetime") + to_chat(user, "You try to align with the bluespace stream...") + if(do_after(user, 20, target = src)) + new /obj/effect/temp_visual/bluespace_fissure(get_turf(src)) + new /obj/effect/temp_visual/bluespace_fissure(get_turf(linked_to)) + user.forceMove(get_turf(linked_to)) + user.visible_message("[user] [slip_in_message].", ignored_mob = user) + user.visible_message("[user] [slip_out_message].", "...and find your way to the other side.") + +/datum/brain_trauma/special/psychotic_brawling + name = "Violent Psychosis" + desc = "Patient fights in unpredictable ways, ranging from helping his target to hitting them with brutal strength." + scan_desc = "violent psychosis" + gain_text = "You feel unhinged..." + lose_text = "You feel more balanced." + var/datum/martial_art/psychotic_brawling/psychotic_brawling + +/datum/brain_trauma/special/psychotic_brawling/on_gain() + ..() + psychotic_brawling = new(null) + if(!psychotic_brawling.teach(owner, TRUE)) + to_chat(owner, "But your martial knowledge keeps you grounded.") + qdel(src) + +/datum/brain_trauma/special/psychotic_brawling/on_lose() + ..() + psychotic_brawling.remove(owner) + QDEL_NULL(psychotic_brawling) \ No newline at end of file diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm new file mode 100644 index 0000000000..d48392f276 --- /dev/null +++ b/code/datums/brain_damage/split_personality.dm @@ -0,0 +1,218 @@ +#define OWNER 0 +#define STRANGER 1 + +/datum/brain_trauma/severe/split_personality + name = "Split Personality" + desc = "Patient's brain is split into two personalities, which randomly switch control of the body." + scan_desc = "complete lobe separation" + gain_text = "You feel like your mind was split in two." + lose_text = "You feel alone again." + var/current_controller = OWNER + var/initialized = FALSE //to prevent personalities deleting themselves while we wait for ghosts + var/mob/living/split_personality/stranger_backseat //there's two so they can swap without overwriting + var/mob/living/split_personality/owner_backseat + +/datum/brain_trauma/severe/split_personality/on_gain() + ..() + make_backseats() + get_ghost() + +/datum/brain_trauma/severe/split_personality/proc/make_backseats() + stranger_backseat = new(owner, src) + owner_backseat = new(owner, src) + +/datum/brain_trauma/severe/split_personality/proc/get_ghost() + set waitfor = FALSE + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s split personality?", null, null, null, 75, stranger_backseat) + if(LAZYLEN(candidates)) + var/client/C = pick(candidates) + stranger_backseat.key = C.key + else + qdel(src) + +/datum/brain_trauma/severe/split_personality/on_life() + if(owner.stat == DEAD) + if(current_controller != OWNER) + switch_personalities() + qdel(src) + else if(prob(3)) + switch_personalities() + ..() + +/datum/brain_trauma/severe/split_personality/on_lose() + if(current_controller != OWNER) //it would be funny to cure a guy only to be left with the other personality, but it seems too cruel + switch_personalities() + QDEL_NULL(stranger_backseat) + QDEL_NULL(owner_backseat) + ..() + +/datum/brain_trauma/severe/split_personality/proc/switch_personalities() + if(QDELETED(owner) || owner.stat == DEAD || QDELETED(stranger_backseat) || QDELETED(owner_backseat)) + return + + var/mob/living/split_personality/current_backseat + var/mob/living/split_personality/free_backseat + if(current_controller == OWNER) + current_backseat = stranger_backseat + free_backseat = owner_backseat + else + current_backseat = owner_backseat + free_backseat = stranger_backseat + + log_game("[current_backseat]/([current_backseat.ckey]) assumed control of [owner]/([owner.ckey] due to [src]. (Original owner: [current_controller == OWNER ? owner.ckey : current_backseat.ckey])") + to_chat(owner, "You feel your control being taken away... your other personality is in charge now!") + to_chat(current_backseat, "You manage to take control of your body!") + + //Body to backseat + + var/h2b_id = owner.computer_id + var/h2b_ip= owner.lastKnownIP + owner.computer_id = null + owner.lastKnownIP = null + + free_backseat.ckey = owner.ckey + + free_backseat.name = owner.name + + if(owner.mind) + free_backseat.mind = owner.mind + + if(!free_backseat.computer_id) + free_backseat.computer_id = h2b_id + + if(!free_backseat.lastKnownIP) + free_backseat.lastKnownIP = h2b_ip + + //Backseat to body + + var/s2h_id = current_backseat.computer_id + var/s2h_ip= current_backseat.lastKnownIP + current_backseat.computer_id = null + current_backseat.lastKnownIP = null + + owner.ckey = current_backseat.ckey + owner.mind = current_backseat.mind + + if(!owner.computer_id) + owner.computer_id = s2h_id + + if(!owner.lastKnownIP) + owner.lastKnownIP = s2h_ip + + current_controller = !current_controller + + +/mob/living/split_personality + name = "split personality" + real_name = "unknown conscience" + var/mob/living/carbon/body + var/datum/brain_trauma/severe/split_personality/trauma + +/mob/living/split_personality/Initialize(mapload, _trauma) + if(iscarbon(loc)) + body = loc + name = body.real_name + real_name = body.real_name + trauma = _trauma + return ..() + +/mob/living/split_personality/Life() + if(QDELETED(body)) + qdel(src) //in case trauma deletion doesn't already do it + + if((body.stat == DEAD && trauma.owner_backseat == src)) + trauma.switch_personalities() + qdel(trauma) + + //if one of the two ghosts, the other one stays permanently + if(!body.client && trauma.initialized) + trauma.switch_personalities() + qdel(trauma) + + ..() + +/mob/living/split_personality/Login() + ..() + to_chat(src, "As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.") + +/mob/living/split_personality/say(message) + to_chat(src, "You cannot speak, your other self is controlling your body!") + return FALSE + +/mob/living/split_personality/emote(message) + return + +///////////////BRAINWASHING//////////////////// + +/datum/brain_trauma/severe/split_personality/brainwashing + name = "Split Personality" + desc = "Patient's brain is split into two personalities, which randomly switch control of the body." + scan_desc = "complete lobe separation" + gain_text = "" + lose_text = "You are free of your brainwashing." + can_gain = FALSE + var/codeword + var/objective + +/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/brain/B, _permanent, _codeword, _objective) + ..() + if(_codeword) + codeword = _codeword + else + codeword = pick(strings("ion_laws.json", "ionabstract")\ + | strings("ion_laws.json", "ionobjects")\ + | strings("ion_laws.json", "ionadjectives")\ + | strings("ion_laws.json", "ionthreats")\ + | strings("ion_laws.json", "ionfood")\ + | strings("ion_laws.json", "iondrinks")) + +/datum/brain_trauma/severe/split_personality/brainwashing/on_gain() + ..() + var/mob/living/split_personality/traitor/traitor_backseat = stranger_backseat + traitor_backseat.codeword = codeword + traitor_backseat.objective = objective + +/datum/brain_trauma/severe/split_personality/brainwashing/make_backseats() + stranger_backseat = new /mob/living/split_personality/traitor(owner, src, codeword, objective) + owner_backseat = new(owner, src) + +/datum/brain_trauma/severe/split_personality/brainwashing/get_ghost() + set waitfor = FALSE + var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [owner]'s brainwashed mind?", null, null, null, 75, stranger_backseat) + if(LAZYLEN(candidates)) + var/client/C = pick(candidates) + stranger_backseat.key = C.key + else + qdel(src) + +/datum/brain_trauma/severe/split_personality/brainwashing/on_life() + return //no random switching + +/datum/brain_trauma/severe/split_personality/brainwashing/on_hear(message, speaker, message_language, raw_message, radio_freq) + if(owner.disabilities & DEAF || owner == speaker) + return message + if(findtext(message, codeword)) + message = replacetext(message, codeword, "[codeword]") + addtimer(CALLBACK(src, /datum/brain_trauma/severe/split_personality.proc/switch_personalities), 10) + return message + +/datum/brain_trauma/severe/split_personality/brainwashing/on_say(message) + if(findtext(message, codeword)) + return "" //oh hey did you want to tell people about the secret word to bring you back? + return message + +/mob/living/split_personality/traitor + name = "split personality" + real_name = "unknown conscience" + var/objective + var/codeword + +/mob/living/split_personality/traitor/Login() + ..() + to_chat(src, "As a brainwashed personality, you cannot do anything yet but observe. However, you may gain control of your body if you hear the special codeword, switching places with the current personality.") + to_chat(src, "Your activation codeword is: [codeword]") + if(objective) + to_chat(src, "Your master left you an objective: [objective]. Follow it at all costs when in control.") + +#undef OWNER +#undef STRANGER diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 2984987103..fc2aa1533c 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -962,6 +962,42 @@ manipulate_organs(C) href_list["datumrefresh"] = href_list["editorgans"] + else if(href_list["givetrauma"]) + if(!check_rights(0)) + return + + var/mob/living/carbon/C = locate(href_list["givetrauma"]) in GLOB.mob_list + if(!istype(C)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return + + var/list/traumas = subtypesof(/datum/brain_trauma) + var/result = input(usr, "Choose the brain trauma to apply","Traumatize") as null|anything in traumas + var/permanent = alert("Do you want to make the trauma unhealable?", "Permanently Traumatize", "Yes", "No") + if(!usr) + return + if(QDELETED(C)) + to_chat(usr, "Mob doesn't exist anymore") + return + + if(result) + C.gain_trauma(result, permanent) + + href_list["datumrefresh"] = href_list["givetrauma"] + + else if(href_list["curetraumas"]) + if(!check_rights(0)) + return + + var/mob/living/carbon/C = locate(href_list["curetraumas"]) in GLOB.mob_list + if(!istype(C)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return + + C.cure_all_traumas(TRUE, TRUE) + + href_list["datumrefresh"] = href_list["curetraumas"] + else if(href_list["hallucinate"]) if(!check_rights(0)) return diff --git a/code/datums/diseases/advance/symptoms/confusion.dm b/code/datums/diseases/advance/symptoms/confusion.dm index 04418610e5..209c7b0bf6 100644 --- a/code/datums/diseases/advance/symptoms/confusion.dm +++ b/code/datums/diseases/advance/symptoms/confusion.dm @@ -54,8 +54,8 @@ Bonus else to_chat(M, "You can't think straight!") M.confused = min(100 * power, M.confused + 8) - if(brain_damage && M.getBrainLoss()<=80) - M.adjustBrainLoss(5 * power) + if(brain_damage) + M.adjustBrainLoss(3 * power, 80) M.updatehealth() return diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index df6bda1729..08160b6719 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -27,7 +27,9 @@ Bonus symptom_delay_max = 10 var/purge_alcohol = FALSE var/brain_heal = FALSE + var/trauma_heal = FALSE threshold_desc = "Resistance 6: Heals brain damage.
\ + Resistance 9: Heals brain traumas.
\ Transmission 8: Purges alcohol in the bloodstream." /datum/symptom/mind_restoration/Start(datum/disease/advance/A) @@ -35,6 +37,8 @@ Bonus return if(A.properties["resistance"] >= 6) //heal brain damage brain_heal = TRUE + if(A.properties["resistance"] >= 9) //heal brain traumas + trauma_heal = TRUE if(A.properties["transmittable"] >= 8) //purge alcohol purge_alcohol = TRUE @@ -66,3 +70,12 @@ Bonus if(brain_heal && A.stage >= 5) M.adjustBrainLoss(-3) +<<<<<<< HEAD +======= + if(trauma_heal && iscarbon(M)) + var/mob/living/carbon/C = M + if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) + C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) + if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) + C.cure_trauma_type(BRAIN_TRAUMA_MILD) +>>>>>>> 550d711... Brain Traumas (#31727) diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 576518b955..49f8afcaff 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -24,15 +24,15 @@ if(prob(2)) to_chat(affected_mob, "You don't feel like yourself.") if(prob(5)) - affected_mob.adjustBrainLoss(1) + affected_mob.adjustBrainLoss(1, 170) affected_mob.updatehealth() if(3) if(prob(2)) affected_mob.emote("stare") if(prob(2)) affected_mob.emote("drool") - if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't retard you to death now - affected_mob.adjustBrainLoss(2) + if(prob(10)) + affected_mob.adjustBrainLoss(2, 170) affected_mob.updatehealth() if(prob(2)) to_chat(affected_mob, "Your try to remember something important...but can't.") @@ -42,8 +42,8 @@ affected_mob.emote("stare") if(prob(2)) affected_mob.emote("drool") - if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now - affected_mob.adjustBrainLoss(3) + if(prob(15)) + affected_mob.adjustBrainLoss(3, 170) affected_mob.updatehealth() if(prob(2)) to_chat(affected_mob, "Strange buzzing fills your head, removing all thoughts.") diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 8974c388b1..b4b49dc81b 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -58,7 +58,7 @@ "[A] kicks your head, knocking you out!") playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1) D.SetSleeping(300) - D.adjustBrainLoss(25) + D.adjustBrainLoss(15, 150) return 1 /datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D) diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm new file mode 100644 index 0000000000..0d6a85359d --- /dev/null +++ b/code/datums/martial/psychotic_brawl.dm @@ -0,0 +1,68 @@ +/datum/martial_art/psychotic_brawling + name = "Psychotic Brawling" + +/datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + return psycho_attack(A,D) + +/datum/martial_art/psychotic_brawling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + return psycho_attack(A,D) + +/datum/martial_art/psychotic_brawling/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + return psycho_attack(A,D) + +/datum/martial_art/psychotic_brawling/proc/psycho_attack(mob/living/carbon/human/A, mob/living/carbon/human/D) + var/atk_verb + switch(rand(1,8)) + if(1) + D.help_shake_act(A) + atk_verb = "helped" + if(2) + A.emote("cry") + A.Stun(20) + atk_verb = "cried looking at" + if(3) + if(A.grab_state >= GRAB_AGGRESSIVE) + D.grabbedby(A, 1) + else + A.start_pulling(D, 1) + if(A.pulling) + D.drop_all_held_items() + D.stop_pulling() + if(A.a_intent == INTENT_GRAB) + add_logs(A, D, "grabbed", addition="aggressively") + D.visible_message("[A] violently grabs [D]!", \ + "[A] violently grabs you!") + A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab + else + add_logs(A, D, "grabbed", addition="passively") + A.grab_state = GRAB_PASSIVE + if(4) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + atk_verb = "headbutts" + D.visible_message("[A] [atk_verb] [D]!", \ + "[A] [atk_verb] you!") + playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, 1, -1) + D.apply_damage(rand(5,10), BRUTE, "head") + A.apply_damage(rand(5,10), BRUTE, "head") + if(!istype(A.head,/obj/item/clothing/head/helmet/) && !istype(A.head,/obj/item/clothing/head/hardhat)) + A.adjustBrainLoss(5) + if(!istype(D.head,/obj/item/clothing/head/helmet/) && !istype(D.head,/obj/item/clothing/head/hardhat)) + D.adjustBrainLoss(5) + A.Stun(rand(5,30)) + D.Stun(rand(5,30)) + if(5,6) + A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) + atk_verb = pick("punches", "kicks", "hits", "slams into") + D.visible_message("[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!", \ + "[A] [atk_verb] you with inhuman strength, sending you flying backwards!") + D.apply_damage(rand(15,30), BRUTE) + playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, 1, -1) + var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A))) + D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time. + D.Knockdown(60) + if(7,8) + basic_hit(A,D) + + if(atk_verb) + add_logs(A, D, "[atk_verb] (Psychotic Brawling)") + return 1 \ No newline at end of file diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index ed46910148..f3a1f53dd2 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -240,7 +240,7 @@ H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \ "[user] knocks you unconscious!") H.SetSleeping(600) - H.adjustBrainLoss(25) + H.adjustBrainLoss(15, 150) else return ..() diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 2959c73125..091c3abedf 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -95,13 +95,13 @@ return trim(message) -/datum/mutation/human/unintelligable - name = "Unintelligable" +/datum/mutation/human/unintelligible + name = "Unintelligible" 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) +/datum/mutation/human/unintelligible/say_mod(message) if(message) var/prefix=copytext(message,1,2) if(prefix == ";") @@ -123,7 +123,7 @@ suffix = copytext(cword,length(cword)-1,length(cword) ) if(length(cword)) rearranged += cword - message = "[prefix][uppertext(jointext(rearranged," "))]!!" + message ="[prefix][jointext(rearranged," ")]" return message diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index da445b94ce..c3a591a278 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -183,6 +183,7 @@ to_chat(H, "You feel intensely watched.") sleep(5) to_chat(H, "Your mind snaps!") + H.gain_trauma_type(BRAIN_TRAUMA_MILD) to_chat(H, "You can't remember how you got here...") var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) var/datum/objective/abductee/O = new objtype() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 58f37e5945..2f97bc458b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -680,7 +680,7 @@ if(ishuman(user) && prob(40) && src.density) var/mob/living/carbon/human/H = user - if(H.getBrainLoss() >= 60 && Adjacent(user)) + if((H.disabilities & DUMB) && Adjacent(user)) playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) if(!istype(H.head, /obj/item/clothing/head/helmet)) H.visible_message("[user] headbutts the airlock.", \ diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 1099095b46..abec0c2641 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -169,6 +169,7 @@ Burn Severity: [patient.getFireLoss()]%
[patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]
[patient.getBrainLoss() ? "Significant brain damage detected." : ""]
+ [length(patient.get_traumas()) ? "Brain Traumas detected." : ""]
"} /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents() diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index 835738255e..0928fd9ca6 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -246,6 +246,11 @@ duration = 8 randomdir = 0 +/obj/effect/temp_visual/bluespace_fissure + name = "bluespace fissure" + icon_state = "bluestream_fade" + duration = 9 + /obj/effect/temp_visual/gib_animation icon = 'icons/mob/mob.dmi' duration = 15 diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 51a81c46aa..7c0f4dd99b 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -165,10 +165,6 @@ ARCD if (!ishuman(usr) && !usr.has_unlimited_silicon_privilege) return ..(usr) - var/mob/living/carbon/human/H = usr - if(H.getBrainLoss() >= 60) - return - var/t1 = text("") diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 358ffd3e10..bdde32fb8a 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -547,7 +547,7 @@ H.emote("gasp") H.Jitter(100) if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + H.adjustBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))), 150) add_logs(user, H, "revived", defib) if(req_defib) defib.deductcharge(revivecost) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index fd56c6283f..18e64c3639 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -48,7 +48,7 @@ add_fingerprint(user) if(istype(M) && on && user.zone_selected in list("eyes", "mouth")) - if((user.disabilities & CLUMSY || user.getBrainLoss() >= 60) && prob(50)) //too dumb to use flashlight properly + if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head if(!user.IsAdvancedToolUser()) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a5dbb71924..635151acf1 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -87,7 +87,7 @@ GAS ANALYZER /obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user) // Clumsiness/brain damage check - if ((user.disabilities & CLUMSY || user.getBrainLoss() >= 60) && prob(50)) + if ((user.disabilities & (CLUMSY | DUMB)) && prob(50)) to_chat(user, "You stupidly try to analyze the floor's vitals!") user.visible_message("[user] has analyzed the floor's vitals!") to_chat(user, "Analyzing results for The floor:\n\tOverall status: Healthy") @@ -152,14 +152,21 @@ GAS ANALYZER to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") if(advanced) to_chat(user, "\tCellular Damage Level: [M.getCloneLoss()].") - if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain)) + if (M.getBrainLoss() >= 200 || !M.getorgan(/obj/item/organ/brain)) to_chat(user, "\tSubject brain function is non-existent.") - else if (M.getBrainLoss() >= 60) - to_chat(user, "\tSevere brain damage detected. Subject likely to have mental retardation.") - else if (M.getBrainLoss() >= 10) - to_chat(user, "\tBrain damage detected. Subject may have had a concussion.") + else if (M.getBrainLoss() >= 120) + to_chat(user, "\tSevere brain damage detected. Subject likely to have mental traumas.") + else if (M.getBrainLoss() >= 45) + to_chat(user, "\tBrain damage detected.") + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(LAZYLEN(C.get_traumas())) + var/list/trauma_text = list() + for(var/datum/brain_trauma/B in C.get_traumas()) + trauma_text += B.scan_desc + to_chat(user, "\tCerebral traumas detected: subjects appears to be suffering from [english_list(trauma_text)].") if(advanced) - to_chat(user, "\tBrain Activity Level: [100 - M.getBrainLoss()]%.") + to_chat(user, "\tBrain Activity Level: [(200 - M.getBrainLoss())/2]%.") if (M.radiation) to_chat(user, "\tSubject is irradiated.") if(advanced) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index d76bc6856a..c2c6c491f2 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -265,13 +265,13 @@ name = "\improper DNA injector (Smile)" add_mutations_static = list(SMILE) -/obj/item/dnainjector/unintelligablemut - name = "\improper DNA injector (Unintelligable)" - add_mutations_static = list(UNINTELLIGABLE) +/obj/item/dnainjector/unintelligiblemut + name = "\improper DNA injector (Unintelligible)" + add_mutations_static = list(UNINTELLIGIBLE) -/obj/item/dnainjector/antiunintelligable - name = "\improper DNA injector (Anti-Unintelligable)" - remove_mutations_static = list(UNINTELLIGABLE) +/obj/item/dnainjector/antiunintelligible + name = "\improper DNA injector (Anti-Unintelligible)" + remove_mutations_static = list(UNINTELLIGIBLE) /obj/item/dnainjector/swedishmut name = "\improper DNA injector (Swedish)" diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index a00e97b8fe..ef04fc48f5 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", else if(iscarbon(M)) var/mob/living/carbon/C = M if(!istype(C.head, /obj/item/clothing/head/helmet)) - C.adjustBrainLoss(10) + C.adjustBrainLoss(5, 60) to_chat(C, "You feel dumber.") if(smack) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 79b6554fec..0753f942dc 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -437,7 +437,7 @@ SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage") for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.") - H.setBrainLoss(60) + H.adjustBrainLoss(60, 80) message_admins("[key_name_admin(usr)] made everybody retarded") if("eagles")//SCRAW diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index bf12b3eb66..a4e26e5c9a 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1221,7 +1221,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits target.electrocution_animation(40) to_chat(target, "The gods have punished you for your sins!") if(ADMIN_PUNISHMENT_BRAINDAMAGE) - target.adjustBrainLoss(75) + target.adjustBrainLoss(199, 199) if(ADMIN_PUNISHMENT_GIB) target.gib(FALSE) if(ADMIN_PUNISHMENT_BSA) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 06d4c4deb9..5a0c59d73c 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/device/assembly/mousetrap name = "mousetrap" desc = "A handy little spring-loaded trap for catching pesty rodents." @@ -141,3 +142,147 @@ /obj/item/device/assembly/mousetrap/armed icon_state = "mousetraparmed" armed = 1 +======= +/obj/item/device/assembly/mousetrap + name = "mousetrap" + desc = "A handy little spring-loaded trap for catching pesty rodents." + icon_state = "mousetrap" + materials = list(MAT_METAL=100) + attachable = 1 + var/armed = 0 + + +/obj/item/device/assembly/mousetrap/examine(mob/user) + ..() + if(armed) + to_chat(user, "The mousetrap is armed!") + else + to_chat(user, "The mousetrap is not armed.") + +/obj/item/device/assembly/mousetrap/activate() + if(..()) + armed = !armed + if(!armed) + if(ishuman(usr)) + var/mob/living/carbon/human/user = usr + if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + to_chat(user, "Your hand slips, setting off the trigger!") + pulse(0) + update_icon() + if(usr) + playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + +/obj/item/device/assembly/mousetrap/describe() + return "The pressure switch is [armed?"primed":"safe"]." + +/obj/item/device/assembly/mousetrap/update_icon() + if(armed) + icon_state = "mousetraparmed" + else + icon_state = "mousetrap" + if(holder) + holder.update_icon() + +/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") + if(!armed) + return + var/obj/item/bodypart/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(PIERCEIMMUNE in H.dna.species.species_traits) + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + return 0 + switch(type) + if("feet") + if(!H.shoes) + affecting = H.get_bodypart(pick("l_leg", "r_leg")) + H.Knockdown(60) + if("l_hand", "r_hand") + if(!H.gloves) + affecting = H.get_bodypart(type) + H.Stun(60) + if(affecting) + if(affecting.receive_damage(1, 0)) + H.update_damage_overlays() + else if(ismouse(target)) + var/mob/living/simple_animal/mouse/M = target + visible_message("SPLAT!") + M.splat() + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + + +/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) + if(!armed) + to_chat(user, "You arm [src].") + else + if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + to_chat(user, "You disarm [src].") + armed = !armed + update_icon() + playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + + +/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) + if(armed) + if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + ..() + + +/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) + if(armed) + if(ismob(AM)) + var/mob/MM = AM + if(!(MM.movement_type & FLYING)) + if(ishuman(AM)) + var/mob/living/carbon/H = AM + if(H.m_intent == MOVE_INTENT_RUN) + triggered(H) + H.visible_message("[H] accidentally steps on [src].", \ + "You accidentally step on [src]") + else if(ismouse(MM)) + triggered(MM) + else if(AM.density) // For mousetrap grenades, set off by anything heavy + triggered(AM) + ..() + + +/obj/item/device/assembly/mousetrap/on_found(mob/finder) + if(armed) + finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") + return 1 //end the search! + return 0 + + +/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) + if(!armed) + return ..() + visible_message("[src] is triggered by [A].") + triggered(null) + + +/obj/item/device/assembly/mousetrap/armed + icon_state = "mousetraparmed" + armed = 1 +>>>>>>> 550d711... Brain Traumas (#31727) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d95591b6fd..194edd77b1 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -454,7 +454,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list( var/list/image/delusions = list() cost = 50 -/datum/hallucination/delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null) +/datum/hallucination/delusion/New(mob/living/carbon/T, forced, force_kind = null , duration = 300,skip_nearby = 1, custom_icon = null, custom_icon_file = null, custom_name = null) . = ..() var/image/A = null var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie") @@ -467,23 +467,31 @@ GLOBAL_LIST_INIT(hallucinations_major, list( switch(kind) if("monkey")//Monkey A = image('icons/mob/monkey.dmi',H,"monkey1") + A.name = "Monkey ([rand(1,999)])" if("carp")//Carp A = image('icons/mob/animal.dmi',H,"carp") + A.name = "Space Carp" if("corgi")//Corgi A = image('icons/mob/pets.dmi',H,"corgi") + A.name = "Corgi" if("skeleton")//Skeletons A = image('icons/mob/human.dmi',H,"skeleton") + A.name = "Skeleton" if("zombie")//Zombies A = image('icons/mob/human.dmi',H,"zombie") + A.name = "Zombie" if("demon")//Demon A = image('icons/mob/mob.dmi',H,"daemon") + A.name = "Demon" if("custom") A = image(custom_icon_file, H, custom_icon) + A.name = custom_name A.override = 1 if(target.client) delusions |= A target.client.images |= A - QDEL_IN(src, duration) + if(duration) + QDEL_IN(src, duration) /datum/hallucination/delusion/Destroy() for(var/image/I in delusions) diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index aefb6f48ae..7f7fdca900 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -68,7 +68,7 @@ Chaplain B.name = "Guys Gone Wild" if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes") B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition") - H.setBrainLoss(100) // starts off retarded as fuck + H.adjustBrainLoss(100) // starts off retarded as fuck if("science") B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") else diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 55f0c0b681..3f67171e80 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -14,6 +14,8 @@ var/damaged_brain = FALSE //whether the brain organ is damaged. var/decoy_override = FALSE //I apologize to the security players, and myself, who abused this, but this is going to go. + var/list/datum/brain_trauma/traumas = list() + /obj/item/organ/brain/changeling_brain vital = FALSE decoy_override = TRUE @@ -41,11 +43,21 @@ QDEL_NULL(brainmob) + for(var/X in traumas) + var/datum/brain_trauma/BT = X + BT.owner = owner + BT.on_gain() + //Update the body's icon so it doesnt appear debrained anymore C.update_hair() /obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) ..() + for(var/X in traumas) + var/datum/brain_trauma/BT = X + BT.on_lose(TRUE) + BT.owner = null + if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer) transfer_identity(C) C.update_hair() @@ -134,6 +146,30 @@ else ..() +/obj/item/organ/brain/proc/get_brain_damage() + var/brain_damage_threshold = max_integrity * BRAIN_DAMAGE_INTEGRITY_MULTIPLIER + var/offset_integrity = obj_integrity - (max_integrity - brain_damage_threshold) + . = (1 - (offset_integrity / brain_damage_threshold)) * BRAIN_DAMAGE_DEATH + +/obj/item/organ/brain/proc/adjust_brain_damage(amount, maximum) + var/adjusted_amount + if(amount >= 0 && maximum) + var/brainloss = get_brain_damage() + var/new_brainloss = Clamp(brainloss + amount, 0, maximum) + if(brainloss > new_brainloss) //brainloss is over the cap already + return 0 + adjusted_amount = new_brainloss - brainloss + else + adjusted_amount = amount + + adjusted_amount *= BRAIN_DAMAGE_INTEGRITY_MULTIPLIER + if(adjusted_amount) + if(adjusted_amount >= 0.1) + take_damage(adjusted_amount) + else if(adjusted_amount <= -0.1) + obj_integrity = min(max_integrity, obj_integrity-adjusted_amount) + . = adjusted_amount + /obj/item/organ/brain/Destroy() //copypasted from MMIs. if(brainmob) qdel(brainmob) @@ -144,4 +180,50 @@ name = "alien brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" +<<<<<<< HEAD origin_tech = "biotech=6" +======= + + +////////////////////////////////////TRAUMAS//////////////////////////////////////// + +/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE) + for(var/X in traumas) + var/datum/brain_trauma/BT = X + if(istype(BT, brain_trauma_type) && (consider_permanent || !BT.permanent)) + return BT + + +//Add a specific trauma +/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments) + var/trauma_type + if(ispath(trauma)) + trauma_type = trauma + traumas += new trauma_type(arglist(list(src, permanent) + arguments)) + else + traumas += trauma + trauma.permanent = permanent + +//Add a random trauma of a certain subtype +/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE) + var/list/datum/brain_trauma/possible_traumas = list() + for(var/T in subtypesof(brain_trauma_type)) + var/datum/brain_trauma/BT = T + if(initial(BT.can_gain)) + possible_traumas += BT + + var/trauma_type = pick(possible_traumas) + traumas += new trauma_type(src, permanent) + +//Cure a random trauma of a certain subtype +/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE) + var/datum/brain_trauma/trauma = has_trauma_type(brain_trauma_type) + if(trauma && (cure_permanent || !trauma.permanent)) + qdel(trauma) + +/obj/item/organ/brain/proc/cure_all_traumas(cure_permanent = FALSE) + for(var/X in traumas) + var/datum/brain_trauma/trauma = X + if(cure_permanent || !trauma.permanent) + qdel(trauma) +>>>>>>> 550d711... Brain Traumas (#31727) diff --git a/code/modules/mob/living/brain/status_procs.dm b/code/modules/mob/living/brain/status_procs.dm index c5e01efcf9..2baea2e7cd 100644 --- a/code/modules/mob/living/brain/status_procs.dm +++ b/code/modules/mob/living/brain/status_procs.dm @@ -22,4 +22,4 @@ return /mob/living/brain/set_blurriness() - return + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ff815776f5..e2ae973d43 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -112,7 +112,8 @@ take_bodypart_damage(10) victim.Knockdown(20) Knockdown(20) - visible_message("[src] crashes into [victim], knocking them both over!", "You violently crash into [victim]!") + visible_message("[src] crashes into [victim], knocking them both over!",\ + "You violently crash into [victim]!") playsound(src,'sound/weapons/punch1.ogg',50,1) @@ -765,6 +766,7 @@ update_handcuffed() if(reagents) reagents.addiction_list = list() + cure_all_traumas(TRUE, TRUE) ..() // heal ears after healing disabilities, since ears check DEAF disability // when healing. @@ -849,3 +851,5 @@ .["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]" .["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]" .["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]" + .["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]" + .["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 9cccd4418d..0bfa287a09 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -229,7 +229,7 @@ "[src] was shocked by \the [source]!", \ "You feel a powerful shock coursing through your body!", \ "You hear a heavy electrical crack." \ - ) + ) jitteriness += 1000 //High numbers for violent convulsions do_jitter_animation(jitteriness) stuttering += 2 diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index ebf1d6284d..aecf966350 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -196,3 +196,37 @@ staminaloss = amount if(updating_stamina) update_stamina() + +/mob/living/carbon/getBrainLoss() + . = BRAIN_DAMAGE_DEATH + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.get_brain_damage() + +//Some sources of brain damage shouldn't be deadly +/mob/living/carbon/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH) + if(status_flags & GODMODE) + return 0 + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(!B) + return + B.adjust_brain_damage(amount, maximum) + if(amount <= 0) //cut this early + return + var/brainloss = getBrainLoss() + if(brainloss > BRAIN_DAMAGE_MILD && !has_trauma_type(BRAIN_TRAUMA_MILD)) + if(prob((amount * 2) + ((brainloss - BRAIN_DAMAGE_MILD) / 5))) //1 damage|50 brain damage = 4% chance + gain_trauma_type(BRAIN_TRAUMA_MILD) + if(brainloss > BRAIN_DAMAGE_SEVERE && !has_trauma_type(BRAIN_TRAUMA_SEVERE) && !has_trauma_type(BRAIN_TRAUMA_SPECIAL)) + if(prob(amount + ((brainloss - BRAIN_DAMAGE_SEVERE) / 15))) //1 damage|150 brain damage = 3% chance + if(prob(20)) + gain_trauma_type(BRAIN_TRAUMA_SPECIAL) + else + gain_trauma_type(BRAIN_TRAUMA_SEVERE) + +/mob/living/carbon/setBrainLoss(amount) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + var/adjusted_amount = amount - B.get_brain_damage() + B.adjust_brain_damage(adjusted_amount, null) + diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 53b087d768..8c97bc71a3 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -69,7 +69,7 @@ else msg += "[t_He] [t_is] severely deformed!\n" - if(getBrainLoss() > 60) + if(disabilities & DUMB) msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n" if(fire_stacks > 0) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2dc4236652..6ed9291b83 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -7,7 +7,7 @@ var/t_has = p_have() var/t_is = p_are() - var/msg = "*---------*\nThis is [src.name]!\n" + var/msg = "*---------*\nThis is [name]!\n" var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) @@ -284,7 +284,7 @@ if(stat == UNCONSCIOUS) msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n" else - if(getBrainLoss() >= 60) + if(disabilities & DUMB) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" if(InCritical()) msg += "[t_He] [t_is] barely conscious.\n" diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b5f8ab7c81..d1d657652b 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -103,7 +103,9 @@ /mob/living/carbon/human/IsAdvancedToolUser() - return 1//Humans can use guns and such + if(disabilities & MONKEYLIKE) + return FALSE + return TRUE//Humans can use guns and such /mob/living/carbon/human/reagent_check(datum/reagent/R) return dna.species.handle_chemicals(R,src) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 67843b3e64..cca672d3d8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -20,8 +20,6 @@ #define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point #define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point -#define BRAIN_DAMAGE_FILE "brain_damage_lines.json" - /mob/living/carbon/human/Life() set invisibility = 0 set background = BACKGROUND_ENABLED @@ -74,14 +72,6 @@ else if(eye_blurry) //blurry eyes heal slowly adjust_blurriness(-1) - if (getBrainLoss() >= 60 && stat == CONSCIOUS) - if(prob(3)) - if(prob(25)) - emote("drool") - else - say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage")) - - /mob/living/carbon/human/handle_mutations_and_radiation() if(!dna || !dna.species.handle_mutations_and_radiation(src)) ..() @@ -430,7 +420,7 @@ All effects don't start immediately, but rather get worse over time; the rate is to_chat(src, "Maybe you should lie down for a bit...") if(drunkenness >= 91) - adjustBrainLoss(0.4) + adjustBrainLoss(0.4, 60) if(prob(20) && !stat) if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && (z in GLOB.station_z_levels)) //QoL mainly to_chat(src, "You're so tired... but you can't miss that shuttle...") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 5072880c01..31f1678428 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1359,8 +1359,13 @@ GLOBAL_LIST_EMPTY(roundstart_races) target.apply_damage(damage, BRUTE, affecting, armor_block) add_logs(user, target, "punched") if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold) +<<<<<<< HEAD target.visible_message("[user] has weakened [target]!", \ "[user] has weakened [target]!") +======= + target.visible_message("[user] has knocked [target] down!", \ + "[user] has knocked [target] down!", null, COMBAT_MESSAGE_RANGE) +>>>>>>> 550d711... Brain Traumas (#31727) target.apply_effect(80, KNOCKDOWN, armor_block) target.forcesay(GLOB.hit_appends) else if(target.lying) @@ -1404,7 +1409,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(randn <= 60) var/obj/item/I = null if(target.pulling) - to_chat(target, "[user] has broken [target]'s grip on [target.pulling]!") + target.visible_message("[user] has broken [target]'s grip on [target.pulling]!") target.stop_pulling() else I = target.get_active_held_item() @@ -1509,7 +1514,10 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.visible_message("[H] has been knocked senseless!", \ "[H] has been knocked senseless!") H.confused = max(H.confused, 20) + H.adjustBrainLoss(20) H.adjust_blurriness(10) + if(prob(20)) + H.gain_trauma(/datum/brain_trauma/mild/concussion) if(prob(I.force + ((100 - H.health)/2)) && H != user) var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 0e009bcd7b..aca6973355 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -3,11 +3,11 @@ amount = dna.species.spec_stun(src,amount) return ..() -/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canstun = 0) +/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canknockdown = 0) amount = dna.species.spec_stun(src,amount) return ..() -/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canstun = 0) +/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0) amount = dna.species.spec_stun(src,amount) return ..() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 44613a9036..77bc8fbfc0 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -13,9 +13,17 @@ handle_blood() if(stat != DEAD) +<<<<<<< HEAD for(var/V in internal_organs) var/obj/item/organ/O = V O.on_life() +======= + handle_brain_damage() + + if(stat != DEAD) + handle_liver() + +>>>>>>> 550d711... Brain Traumas (#31727) if(stat == DEAD) stop_sound_channel(CHANNEL_HEARTBEAT) @@ -437,3 +445,20 @@ adjustToxLoss(8) if(prob(30)) to_chat(src, "You feel confused and nauseous...")//actual symptoms of liver failure + + +//////////////// +//BRAIN DAMAGE// +//////////////// + +/mob/living/carbon/proc/handle_brain_damage() + for(var/T in get_traumas()) + var/datum/brain_trauma/BT = T + BT.on_life() + + if(getBrainLoss() >= BRAIN_DAMAGE_DEATH) //rip + to_chat(src, "The last spark of life in your brain fizzles out...") + death() + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + B.damaged_brain = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 526a2ea09b..a3c8042442 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -1,4 +1,6 @@ /mob/living/carbon/treat_message(message) + for(var/datum/brain_trauma/trauma in get_traumas()) + message = trauma.on_say(message) message = ..(message) var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) if(!T) //hoooooouaah! @@ -34,4 +36,16 @@ if(T) . = T.could_speak_in_language(dt) else +<<<<<<< HEAD . = initial(dt.flags_1) & TONGUELESS_SPEECH +======= + . = initial(dt.flags) & TONGUELESS_SPEECH + +/mob/living/carbon/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode) + if(!client) + return + for(var/T in get_traumas()) + var/datum/brain_trauma/trauma = T + message = trauma.on_hear(message, speaker, message_language, raw_message, radio_freq) + return ..() +>>>>>>> 550d711... Brain Traumas (#31727) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index ccd5f7296b..e46ae2f8e6 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -101,3 +101,35 @@ status_flags |= DISFIGURED //makes them unknown update_body() return 1 + +/mob/living/carbon/proc/get_traumas() + . = list() + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.traumas + +/mob/living/carbon/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.has_trauma_type(brain_trauma_type, consider_permanent) + +/mob/living/carbon/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.gain_trauma(trauma, permanent, arguments) + +/mob/living/carbon/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.gain_trauma_type(brain_trauma_type, permanent) + +/mob/living/carbon/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.cure_trauma_type(brain_trauma_type, cure_permanent) + +/mob/living/carbon/proc/cure_all_traumas(cure_permanent = FALSE) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(B) + . = B.cure_all_traumas(cure_permanent) + diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 8401d92676..dbc8da5a05 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -231,17 +231,13 @@ return amount /mob/living/proc/getBrainLoss() - return brainloss + . = 0 -/mob/living/proc/adjustBrainLoss(amount) - if(status_flags & GODMODE) - return 0 - brainloss = Clamp((brainloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) +/mob/living/proc/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH) + return /mob/living/proc/setBrainLoss(amount) - if(status_flags & GODMODE) - return 0 - brainloss = amount + return /mob/living/proc/getStaminaLoss() return staminaloss diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ff3ebadf15..3b5ae247df 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -15,7 +15,6 @@ var/toxloss = 0 //Toxic damage caused by being poisoned or radiated var/fireloss = 0 //Burn damage caused by being way too hot, too cold or burnt. var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims - var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot. var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are knocked down if it gets too high. Holodeck and hallucinations deal this. diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 7781fd5df6..b1d0484086 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -326,7 +326,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return null /mob/living/proc/treat_message(message) - if(getBrainLoss() >= 60) + if(derpspeech) message = derpspeech(message, stuttering) if(stuttering) @@ -373,7 +373,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( . = "[verb_whisper] in [p_their()] last breath" else if(stuttering) . = "stammers" - else if(getBrainLoss() >= 60) + else if(derpspeech) . = "gibbers" else . = ..() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index bed14bdff4..ddedf1a1ee 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -33,7 +33,16 @@ sync_mind() +<<<<<<< HEAD client.sethotkeys() //set mob specific hotkeys +======= + //Reload alternate appearances + for(var/v in GLOB.active_alternate_appearances) + if(!v) + continue + var/datum/atom_hud/alternate_appearance/AA = v + AA.onNewMob(src) +>>>>>>> 550d711... Brain Traumas (#31727) update_client_colour() if(client) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 20509329bb..b19af6342c 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -400,6 +400,7 @@ pulling = null grab_state = 0 update_pull_hud_icon() + if(isliving(ex_pulled)) var/mob/living/L = ex_pulled L.update_canmove()// mob gets up if it was lyng down in a chokehold diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d9dd2a0eee..edbf11654b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -44,6 +44,7 @@ var/stuttering = 0 //Carbon var/slurring = 0 //Carbon var/cultslurring = 0 //Carbon + var/derpspeech = 0 //Carbon var/real_name = null var/spacewalk = FALSE var/druggy = 0 //Carbon diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 85a8ed5448..f763c3ea86 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -79,6 +79,9 @@ O.setBrainLoss(getBrainLoss(), 0) O.updatehealth() O.radiation = radiation + for(var/T in get_traumas()) + var/datum/brain_trauma/BT = T + O.gain_trauma(BT.type, BT.permanent) //re-add implants to new mob if (tr_flags & TR_KEEPIMPLANTS) @@ -238,6 +241,9 @@ O.setBrainLoss(getBrainLoss(), 0) O.updatehealth() O.radiation = radiation + for(var/T in get_traumas()) + var/datum/brain_trauma/BT = T + O.gain_trauma(BT.type, BT.permanent) //re-add implants to new mob if (tr_flags & TR_KEEPIMPLANTS) diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index a02e98ed2b..867c33e32a 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -45,11 +45,6 @@ to_chat(M, "You feel that your soul has returned to its rightful owner, Nanotrasen.") M.return_soul() else - if(ishuman(M)) - var/mob/living/carbon/human/N = M - if(!istype(N.head, /obj/item/clothing/head/helmet)) - N.adjustBrainLoss(10) - to_chat(N, "You feel dumber.") M.visible_message("[user] beats [M] over the head with [src]!", \ "[user] beats [M] over the head with [src]!") return ..() @@ -207,7 +202,7 @@ if(!user.mind.hasSoul) to_chat(user, "You do not possess a soul.") return 0 - if(prob(user.getBrainLoss())) + if(user.disabilities & DUMB) to_chat(user, "You quickly scrawl 'your name' on the contract.") signIncorrectly() return 0 diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 60d1f64754..534cf515d9 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -99,7 +99,7 @@ . = 1 /datum/reagent/drug/crank/addiction_act_stage4(mob/living/M) - M.adjustBrainLoss(5*REM) + M.adjustBrainLoss(3*REM) M.adjustToxLoss(5*REM, 0) M.adjustBruteLoss(5*REM, 0) ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 08db315b7d..a3c0d2c034 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -628,7 +628,7 @@ . = 1 if(prob(20)) M.losebreath += 4 - M.adjustBrainLoss(2*REM) + M.adjustBrainLoss(2*REM, 150) M.adjustToxLoss(3*REM,0) M.adjustStaminaLoss(10*REM,0) M.blur_eyes(5) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 7547a0834c..ddb08db032 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -59,6 +59,7 @@ M.confused = 0 M.SetSleeping(0, 0) M.jitteriness = 0 + M.cure_all_traumas(TRUE, TRUE) for(var/thing in M.viruses) var/datum/disease/D = thing if(D.severity == VIRUS_SEVERITY_POSITIVE) @@ -792,7 +793,13 @@ color = "#DCDCFF" /datum/reagent/medicine/mannitol/on_mob_life(mob/living/M) - M.adjustBrainLoss(-3*REM) + M.adjustBrainLoss(-2*REM) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL)) + C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL) + if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD)) + C.cure_trauma_type(BRAIN_TRAUMA_MILD) ..() /datum/reagent/medicine/mutadone @@ -1016,7 +1023,7 @@ M.adjustFireLoss(-3 * REM, 0) M.adjustOxyLoss(-15 * REM, 0) M.adjustToxLoss(-3 * REM, 0) - M.adjustBrainLoss(2 * REM) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! + M.adjustBrainLoss(2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! M.adjustCloneLoss(-1 * REM, 0) M.adjustStaminaLoss(-30 * REM, 0) M.jitteriness = min(max(0, M.jitteriness + 3), 30) @@ -1047,7 +1054,7 @@ if (M.hallucination >= 5) M.hallucination -= 5 if(prob(20)) - M.adjustBrainLoss(1*REM) + M.adjustBrainLoss(1*REM, 50) M.adjustStaminaLoss(2.5*REM, 0) ..() . = 1 diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index aab8491249..f6e57d57ca 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -261,7 +261,7 @@ M.adjustBruteLoss(-2, 0) M.adjustFireLoss(-2, 0) else - M.adjustBrainLoss(3) + M.adjustBrainLoss(3, 150) M.adjustToxLoss(1, 0) M.adjustFireLoss(2, 0) M.adjustOxyLoss(2, 0) @@ -280,7 +280,7 @@ M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire M.adjustToxLoss(1, 0) M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard? - M.adjustBrainLoss(5) + M.adjustBrainLoss(5, 150) holder.remove_reagent(src.id, 1) /datum/reagent/medicine/omnizine/godblood @@ -676,7 +676,7 @@ step(M, pick(GLOB.cardinals)) if(prob(5)) M.emote(pick("twitch","drool","moan")) - M.adjustBrainLoss(2) + M.adjustBrainLoss(1) ..() /datum/reagent/sulfur @@ -1029,7 +1029,7 @@ /datum/reagent/impedrezene/on_mob_life(mob/living/M) M.jitteriness = max(M.jitteriness-5,0) if(prob(80)) - M.adjustBrainLoss(1*REM) + M.adjustBrainLoss(2*REM) if(prob(50)) M.drowsyness = max(M.drowsyness, 3) if(prob(10)) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index fd7d5750f1..711c333896 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -455,13 +455,12 @@ toxpwr = 0 /datum/reagent/toxin/neurotoxin2/on_mob_life(mob/living/M) - if(M.brainloss + M.toxloss <= 60) - M.adjustBrainLoss(1*REM) + M.adjustBrainLoss(3*REM, 150) + . = 1 + if(M.toxloss <= 60) M.adjustToxLoss(1*REM, 0) - . = 1 if(current_cycle >= 18) M.Sleeping(40, 0) - . = 1 ..() /datum/reagent/toxin/cyanide diff --git a/code/modules/spells/spell_types/voice_of_god.dm b/code/modules/spells/spell_types/voice_of_god.dm index a5b44b8e0f..eb8950086c 100644 --- a/code/modules/spells/spell_types/voice_of_god.dm +++ b/code/modules/spells/spell_types/voice_of_god.dm @@ -31,9 +31,8 @@ ..() /obj/effect/proc_holder/spell/voice_of_god/cast(list/targets, mob/user = usr) - user.say(uppertext(command), spans = spans, sanitize = FALSE) playsound(get_turf(user), speech_sound, 300, 1, 5) - var/cooldown = voice_of_god(command, user, spans, base_multiplier = power_mod) + var/cooldown = voice_of_god(uppertext(command), user, spans, base_multiplier = power_mod) charge_max = (cooldown * cooldown_mod) /obj/effect/proc_holder/spell/voice_of_god/clown diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm new file mode 100644 index 0000000000..b22b45efce --- /dev/null +++ b/code/modules/surgery/brain_surgery.dm @@ -0,0 +1,42 @@ +/datum/surgery/brain_surgery + name = "brain surgery" + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/saw, + /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/fix_brain, + /datum/surgery_step/close) + + species = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list("head") + requires_bodypart_type = 0 + +/datum/surgery_step/fix_brain + name = "fix brain" + implements = list(/obj/item/hemostat = 85, /obj/item/screwdriver = 35, /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 + time = 120 //long and complicated + +/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/brain/B = target.getorganslot(ORGAN_SLOT_BRAIN) + if(!B) + to_chat(user, "It's hard to do surgery on someone's brain when they don't have one.") + return FALSE + return TRUE + +/datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] begins to fix [target]'s brain.", "You begin to fix [target]'s brain...") + +/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + user.visible_message("[user] successfully fixes [target]'s brain!", "You succeed in fixing [target]'s brain.") + target.adjustBrainLoss(-60) + target.cure_all_traumas() + return TRUE + +/datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(target.getorganslot(ORGAN_SLOT_BRAIN)) + user.visible_message("[user] screws up, causing more damage!", "You screw up, causing more damage!") + target.adjustBrainLoss(80) + else + user.visible_message("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "You suddenly notice that the brain you were working on is not there anymore.") + return FALSE \ No newline at end of file diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 6c340b61f5..c8a47d2096 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -16,6 +16,7 @@ if(!E) to_chat(user, "It's hard to do surgery on someone's eyes when they don't have any.") return FALSE + return TRUE /datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") @@ -32,7 +33,7 @@ /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorgan(/obj/item/organ/brain)) user.visible_message("[user] accidentally stabs [target] right in the brain!", "You accidentally stab [target] right in the brain!") - target.adjustBrainLoss(100) + target.adjustBrainLoss(70) else user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") return FALSE \ No newline at end of file diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 30825f46bb..bc85d9c46e 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -63,9 +63,13 @@ H.stop_sound_channel(CHANNEL_HEARTBEAT) beat = BEAT_NONE - if(H.jitteriness && H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW)) - H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT) - beat = BEAT_FAST + if(H.jitteriness) + if(H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW)) + H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT) + beat = BEAT_FAST + else if(beat == BEAT_FAST) + H.stop_sound_channel(CHANNEL_HEARTBEAT) + beat = BEAT_NONE /obj/item/organ/heart/cursed name = "cursed heart" diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 2ed2c2107e..9e364e49d8 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -249,7 +249,7 @@ if(bz_pp > BZ_trip_balls_min) H.hallucination += 20 if(prob(33)) - H.adjustBrainLoss(3) + H.adjustBrainLoss(3, 150) else if(bz_pp > 0.01) H.hallucination += 5//Removed at 2 per tick so this will slowly build up diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 755d35435d..78f258be67 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -108,12 +108,11 @@ return TRUE /obj/item/organ/vocal_cords/colossus/handle_speech(message) - owner.say(uppertext(message), spans = spans, sanitize = FALSE) playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5) return //voice of god speaks for us /obj/item/organ/vocal_cords/colossus/speak_with(message) - var/cooldown = voice_of_god(message, owner, spans, base_multiplier) + var/cooldown = voice_of_god(uppertext(message), owner, spans, base_multiplier) next_command = world.time + (cooldown * cooldown_mod) ////////////////////////////////////// @@ -135,6 +134,8 @@ else span_list = list() + user.say(message, spans = span_list, sanitize = FALSE) + message = lowertext(message) var/mob/living/list/listeners = list() for(var/mob/living/L in get_hearers_in_view(8, user)) diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index e61f61bc4a..0e4844dced 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -23,9 +23,6 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new) . = shared_ui_interaction(src_object) if(. > UI_CLOSE) . = min(., shared_living_ui_distance(src_object)) // Check the distance... - // Derp a bit if we have brain loss. - if(prob(getBrainLoss())) - return UI_UPDATE /mob/living/silicon/robot/default_can_use_topic(src_object) . = shared_ui_interaction(src_object) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 9771e9bc06ae7e047f4b04db13c730c17340fb93..3451915c092bfdb8db183ef6736c3cf04c96cbc4 100644 GIT binary patch delta 25278 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 C_oTo8 delta 15891 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%0DHFU7YpO=YqIu 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 diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index f3345c08259ef4a91ea801a3d0ee0d868529d959..597ee94d723fd0ae02a18c4f3ac5c5b44099ffc8 100644 GIT binary patch delta 23656 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 a*o~wtid4*LYO7Y1&Se8_`VvjshyMfd32Qk3 diff --git a/strings/phobia.json b/strings/phobia.json new file mode 100644 index 0000000000..343a475b56 --- /dev/null +++ b/strings/phobia.json @@ -0,0 +1,63 @@ +{ + "spiders": [ + "spider", + "web", + "arachnid" + ], + + "space": [ + "space", + "star", + "universe", + "void", + "galaxy", + "spess" + ], + + "security": [ + " sec ", + "security", + "shitcurity", + "baton", + "taser", + "beepsky", + "hos", + "brig", + "gulag" + ], + + "clowns": [ + "clown", + "honk", + "banana", + "slip" + ], + + "greytide": [ + "assistant", + "grey", + "gasmask", + "gas mask", + "stunprod", + "spear", + "revolution", + "viva" + ], + + "lizards": [ + "lizard", + "ligger", + "hiss", + "wag" + ], + + "skeletons": [ + "skeleton", + "milk", + "xylophone", + "bone", + "calcium", + "the ride never ends", + "doot" + ] +} \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index e8b81cbbb8..a678fe8a1b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -270,6 +270,7 @@ #include "code\controllers\subsystem\time_track.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\title.dm" +#include "code\controllers\subsystem\traumas.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\circuit.dm" @@ -332,6 +333,12 @@ #include "code\datums\antagonists\pirate.dm" #include "code\datums\antagonists\revolution.dm" #include "code\datums\antagonists\wizard.dm" +#include "code\datums\brain_damage\brain_trauma.dm" +#include "code\datums\brain_damage\mild.dm" +#include "code\datums\brain_damage\phobia.dm" +#include "code\datums\brain_damage\severe.dm" +#include "code\datums\brain_damage\special.dm" +#include "code\datums\brain_damage\split_personality.dm" #include "code\datums\components\_component.dm" #include "code\datums\components\archaeology.dm" #include "code\datums\components\chasm.dm" @@ -415,6 +422,7 @@ #include "code\datums\martial\cqc.dm" #include "code\datums\martial\krav_maga.dm" #include "code\datums\martial\plasma_fist.dm" +#include "code\datums\martial\psychotic_brawl.dm" #include "code\datums\martial\sleeping_carp.dm" #include "code\datums\martial\wrestling.dm" #include "code\datums\mutations\body.dm" @@ -2327,6 +2335,7 @@ #include "code\modules\stock_market\stockmarket.dm" #include "code\modules\stock_market\stocks.dm" #include "code\modules\surgery\amputation.dm" +#include "code\modules\surgery\brain_surgery.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\dental_implant.dm"