Brain Traumas

This commit is contained in:
XDTM
2017-12-06 19:04:17 +01:00
committed by CitadelStationBot
parent e7e9a4cc9b
commit 988dbe87da
73 changed files with 1622 additions and 105 deletions
@@ -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)
@@ -22,4 +22,4 @@
return
/mob/living/brain/set_blurriness()
return
return
+5 -1
View File
@@ -112,7 +112,8 @@
take_bodypart_damage(10)
victim.Knockdown(20)
Knockdown(20)
visible_message("<span class='danger'>[src] crashes into [victim], knocking them both over!</span>", "<span class='userdanger'>You violently crash into [victim]!</span>")
visible_message("<span class='danger'>[src] crashes into [victim], knocking them both over!</span>",\
"<span class='userdanger'>You violently crash into [victim]!</span>")
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)]"
@@ -229,7 +229,7 @@
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
"<span class='userdanger'>You feel a powerful shock coursing through your body!</span>", \
"<span class='italics'>You hear a heavy electrical crack.</span>" \
)
)
jitteriness += 1000 //High numbers for violent convulsions
do_jitter_animation(jitteriness)
stuttering += 2
@@ -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)
+1 -1
View File
@@ -69,7 +69,7 @@
else
msg += "<b>[t_He] [t_is] severely deformed!</b>\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)
@@ -7,7 +7,7 @@
var/t_has = p_have()
var/t_is = p_are()
var/msg = "<span class='info'>*---------*\nThis is <EM>[src.name]</EM>!\n"
var/msg = "<span class='info'>*---------*\nThis is <EM>[name]</EM>!\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"
@@ -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)
+1 -11
View File
@@ -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, "<span class='warning'>Maybe you should lie down for a bit...</span>")
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, "<span class='warning'>You're so tired... but you can't miss that shuttle...</span>")
@@ -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("<span class='danger'>[user] has weakened [target]!</span>", \
"<span class='userdanger'>[user] has weakened [target]!</span>")
=======
target.visible_message("<span class='danger'>[user] has knocked [target] down!</span>", \
"<span class='userdanger'>[user] has knocked [target] down!</span>", 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, "<span class='warning'>[user] has broken [target]'s grip on [target.pulling]!</span>")
target.visible_message("<span class='warning'>[user] has broken [target]'s grip on [target.pulling]!</span>")
target.stop_pulling()
else
I = target.get_active_held_item()
@@ -1509,7 +1514,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.visible_message("<span class='danger'>[H] has been knocked senseless!</span>", \
"<span class='userdanger'>[H] has been knocked senseless!</span>")
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)
@@ -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 ..()
+25
View File
@@ -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, "<span class='notice'>You feel confused and nauseous...</span>")//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, "<span class='userdanger'>The last spark of life in your brain fizzles out...<span>")
death()
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
if(B)
B.damaged_brain = TRUE
+14
View File
@@ -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)
@@ -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)
+4 -8
View File
@@ -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
@@ -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.
+2 -2
View File
@@ -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
. = ..()
+9
View File
@@ -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)
+1
View File
@@ -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
+1
View File
@@ -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
+6
View File
@@ -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)