mirror of
https://github.com/fulpstation/fulpstation.git
synced 2025-12-10 10:01:40 +00:00
Brain Traumas (#31727)
* Reworks Brain Damage * mechanics * rebalancing * hulks in wheelchairs * yup * bugsquash * Adds narcolepsy, phobias and agnosia. Not guaranteed 100% bug-free yet, testmerge at your own risk. * lizard phobia * Did you know there's a skeleton inside of you RIGHT NOW? * Fixes for the new stuff * The issue with those is that in most rounds you won't see them I'll keep them available so they can be added manually, for example by events and such * Goof reviews * Brainloss is based off brain organ integrity removes brainloss var * Replaces some getorganslot with defines * eyes * put the traumas in the brainnnn * text * args * Adds godwoken, puts split personality in severe, adds brainwashing * Bluespace prophet special trauma (untested) * Some minor stuff * Monophobia, and tweaks * More fixes * fix * a * new tail * Discoordination and Muscle Weakness * thanks for the review! * [B]oneless * agnosia fix * . * go away agnosia * pretend it didn't happen * Shitcode-free-er * bitwisdom * psychotic brawling * i guess this might be important * latest reviews * . * conflict-free * addresses it * surgery fix * a masterpiece * fix * fix again * config * damage formula reworked * who needs to test anyway * fixes some bugs * fix 2 * proper spookin * bluespace prophet fixes and improvements * no bible healing * . * normalizes monophobia chances
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
#define MUT_MUTE "Mute"
|
#define MUT_MUTE "Mute"
|
||||||
#define SMILE "Smile"
|
#define SMILE "Smile"
|
||||||
#define STONER "Stoner"
|
#define STONER "Stoner"
|
||||||
#define UNINTELLIGABLE "Unintelligable"
|
#define UNINTELLIGIBLE "Unintelligible"
|
||||||
#define SWEDISH "Swedish"
|
#define SWEDISH "Swedish"
|
||||||
#define CHAV "Chav"
|
#define CHAV "Chav"
|
||||||
#define ELVIS "Elvis"
|
#define ELVIS "Elvis"
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
|
#define DNA_FACIAL_HAIR_STYLE_BLOCK 6
|
||||||
#define DNA_HAIR_STYLE_BLOCK 7
|
#define DNA_HAIR_STYLE_BLOCK 7
|
||||||
|
|
||||||
#define DNA_STRUC_ENZYMES_BLOCKS 19
|
#define DNA_STRUC_ENZYMES_BLOCKS 18
|
||||||
#define DNA_UNIQUE_ENZYMES_LEN 32
|
#define DNA_UNIQUE_ENZYMES_LEN 32
|
||||||
|
|
||||||
//Transformation proc stuff
|
//Transformation proc stuff
|
||||||
|
|||||||
@@ -485,6 +485,9 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
|
|||||||
|
|
||||||
#define RIDING_OFFSET_ALL "ALL"
|
#define RIDING_OFFSET_ALL "ALL"
|
||||||
|
|
||||||
|
//text files
|
||||||
|
#define BRAIN_DAMAGE_FILE "brain_damage_lines.json"
|
||||||
|
|
||||||
//Fullscreen overlay resolution in tiles.
|
//Fullscreen overlay resolution in tiles.
|
||||||
#define FULLSCREEN_OVERLAY_RESOLUTION_X 15
|
#define FULLSCREEN_OVERLAY_RESOLUTION_X 15
|
||||||
#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15
|
#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15
|
||||||
|
|||||||
@@ -51,6 +51,17 @@
|
|||||||
#define DEVIL_BODYPART "devil"
|
#define DEVIL_BODYPART "devil"
|
||||||
/*see __DEFINES/inventory.dm for bodypart bitflag defines*/
|
/*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
|
//Health hud screws for carbon mobs
|
||||||
#define SCREWYHUD_NONE 0
|
#define SCREWYHUD_NONE 0
|
||||||
#define SCREWYHUD_CRIT 1
|
#define SCREWYHUD_CRIT 1
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
//mob/var/stat things
|
//mob/var/stat things
|
||||||
#define CONSCIOUS 0
|
#define CONSCIOUS 0
|
||||||
#define SOFT_CRIT 1
|
#define SOFT_CRIT 1
|
||||||
#define UNCONSCIOUS 2
|
#define UNCONSCIOUS 2
|
||||||
#define DEAD 3
|
#define DEAD 3
|
||||||
|
|
||||||
@@ -18,6 +18,8 @@
|
|||||||
#define HUSK 64
|
#define HUSK 64
|
||||||
#define NOCLONE 128
|
#define NOCLONE 128
|
||||||
#define CLUMSY 256
|
#define CLUMSY 256
|
||||||
|
#define DUMB 512
|
||||||
|
#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE
|
||||||
|
|
||||||
// bitflags for machine stat variable
|
// bitflags for machine stat variable
|
||||||
#define BROKEN 1
|
#define BROKEN 1
|
||||||
|
|||||||
@@ -135,6 +135,6 @@
|
|||||||
var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]."
|
var/attack_message = "[src] has been [message_verb][message_hit_area] with [I]."
|
||||||
if(user in viewers(src, null))
|
if(user in viewers(src, null))
|
||||||
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
|
attack_message = "[user] has [message_verb] [src][message_hit_area] with [I]!"
|
||||||
visible_message("<span class='danger'>[attack_message]</span>", \
|
visible_message("<span class='danger'>[attack_message]</span>",\
|
||||||
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE)
|
"<span class='userdanger'>[attack_message]</span>", null, COMBAT_MESSAGE_RANGE)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
52
code/controllers/subsystem/traumas.dm
Normal file
52
code/controllers/subsystem/traumas.dm
Normal file
@@ -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
|
||||||
49
code/datums/brain_damage/brain_trauma.dm
Normal file
49
code/datums/brain_damage/brain_trauma.dm
Normal file
@@ -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 = "<span class='notice'>You feel traumatized.</span>"
|
||||||
|
var/lose_text = "<span class='notice'>You no longer feel traumatized.</span>"
|
||||||
|
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
|
||||||
135
code/datums/brain_damage/mild.dm
Normal file
135
code/datums/brain_damage/mild.dm
Normal file
@@ -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 = "<span class='warning'>You feel your grip on reality slipping...</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel more grounded.</span>"
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>Speaking clearly is getting harder.</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel in control of your speech.</span>"
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>You feel dumber.</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel smart again.</span>"
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>Your head hurts!</span>"
|
||||||
|
lose_text = "<span class='notice'>The pressure inside your head starts fading.</span>"
|
||||||
|
|
||||||
|
/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, "<span class='notice'>You forget for a moment what you were doing.</span>")
|
||||||
|
owner.Stun(20)
|
||||||
|
if(11)
|
||||||
|
to_chat(owner, "<span class='warning'>You faint.</span>")
|
||||||
|
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 = "<span class='warning'>Your muscles feel oddly faint.</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel in control of your muscles again.</span>"
|
||||||
|
|
||||||
|
/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, "<span class='warning'>Your leg gives out!</span>")
|
||||||
|
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, "<span class='warning'>You drop [I]!</span>")
|
||||||
|
|
||||||
|
else if(prob(3))
|
||||||
|
to_chat(owner, "<span class='warning'>You feel a sudden weakness in your muscles!</span>")
|
||||||
|
owner.adjustStaminaLoss(50)
|
||||||
|
..()
|
||||||
115
code/datums/brain_damage/phobia.dm
Normal file
115
code/datums/brain_damage/phobia.dm
Normal file
@@ -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 = "<span class='warning'>You start finding [phobia_type] very unnerving...</span>"
|
||||||
|
lose_text = "<span class='notice'>You no longer feel afraid of [phobia_type].</span>"
|
||||||
|
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, "<span class='warning'>You can't bring yourself to say the word \"[word]\"!</span>")
|
||||||
|
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, "<span class='userdanger'>Seeing [reason] [message]!</span>")
|
||||||
|
else if(trigger_word)
|
||||||
|
to_chat(owner, "<span class='userdanger'>Hearing \"[trigger_word]\" [message]!</span>")
|
||||||
|
else
|
||||||
|
to_chat(owner, "<span class='userdanger'>Something [message]!</span>")
|
||||||
|
var/reaction = rand(1,4)
|
||||||
|
switch(reaction)
|
||||||
|
if(1)
|
||||||
|
to_chat(owner, "<span class='warning'>You are paralyzed with fear!</span>")
|
||||||
|
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, "<span class='warning'>You shut your eyes in terror!</span>")
|
||||||
|
owner.Jitter(5)
|
||||||
|
owner.blind_eyes(10)
|
||||||
|
if(4)
|
||||||
|
owner.dizziness += 10
|
||||||
|
owner.confused += 10
|
||||||
|
owner.Jitter(10)
|
||||||
|
owner.stuttering += 10
|
||||||
179
code/datums/brain_damage/severe.dm
Normal file
179
code/datums/brain_damage/severe.dm
Normal file
@@ -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 = "<span class='warning'>You forget how to speak!</span>"
|
||||||
|
lose_text = "<span class='notice'>You suddenly remember how to speak.</span>"
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>You can't see!</span>"
|
||||||
|
lose_text = "<span class='notice'>Your vision returns.</span>"
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>You can't feel your body anymore!</span>"
|
||||||
|
lose_text = "<span class='notice'>You can feel your limbs again!</span>"
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>You have a constant feeling of drowsiness...</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel awake and aware again.</span>"
|
||||||
|
|
||||||
|
/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, "<span class='warning'>You fall asleep.</span>")
|
||||||
|
owner.Sleeping(60)
|
||||||
|
else if(!owner.drowsyness && prob(sleep_chance * 2))
|
||||||
|
to_chat(owner, "<span class='warning'>You feel tired...</span>")
|
||||||
|
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 = "<span class='notice'>You feel like you could be safe on your own.</span>"
|
||||||
|
var/stress = 0
|
||||||
|
|
||||||
|
/datum/brain_trauma/severe/monophobia/on_gain()
|
||||||
|
..()
|
||||||
|
if(check_alone())
|
||||||
|
to_chat(owner, "<span class='warning'>You feel really lonely...</span>")
|
||||||
|
else
|
||||||
|
to_chat(owner, "<span class='notice'>You feel safe, as long as you have people around you.</span>")
|
||||||
|
|
||||||
|
/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, "<span class='warning'>You feel sick...</span>")
|
||||||
|
else
|
||||||
|
to_chat(owner, "<span class='warning'>You feel really sick at the thought of being alone!</span>")
|
||||||
|
addtimer(CALLBACK(owner, /mob/living/carbon.proc/vomit, high_stress), 50) //blood vomit if high stress
|
||||||
|
if(2)
|
||||||
|
if(!high_stress)
|
||||||
|
to_chat(owner, "<span class='warning'>You can't stop shaking...</span>")
|
||||||
|
owner.dizziness += 20
|
||||||
|
owner.confused += 20
|
||||||
|
owner.Jitter(20)
|
||||||
|
else
|
||||||
|
to_chat(owner, "<span class='warning'>You feel weak and scared! If only you weren't alone...</span>")
|
||||||
|
owner.dizziness += 20
|
||||||
|
owner.confused += 20
|
||||||
|
owner.Jitter(20)
|
||||||
|
owner.adjustStaminaLoss(50)
|
||||||
|
|
||||||
|
if(3, 4)
|
||||||
|
if(!high_stress)
|
||||||
|
to_chat(owner, "<span class='warning'>You feel really lonely...</span>")
|
||||||
|
else
|
||||||
|
to_chat(owner, "<span class='warning'>You're going mad with loneliness!</span>")
|
||||||
|
owner.hallucination += 20
|
||||||
|
|
||||||
|
if(5)
|
||||||
|
if(!high_stress)
|
||||||
|
to_chat(owner, "<span class='warning'>Your heart skips a beat.</span>")
|
||||||
|
owner.adjustOxyLoss(8)
|
||||||
|
else
|
||||||
|
if(prob(15) && ishuman(owner))
|
||||||
|
var/mob/living/carbon/human/H = owner
|
||||||
|
H.set_heartattack(TRUE)
|
||||||
|
to_chat(H, "<span class='userdanger'>You feel a stabbing pain in your heart!</span>")
|
||||||
|
else
|
||||||
|
to_chat(owner, "<span class='userdanger'>You feel your heart lurching in your chest...</span>")
|
||||||
|
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 = "<span class='warning'>You can barely control your hands!</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel in control of your hands again.</span>"
|
||||||
|
|
||||||
|
/datum/brain_trauma/severe/discoordination/on_gain()
|
||||||
|
owner.disabilities |= MONKEYLIKE
|
||||||
|
..()
|
||||||
|
|
||||||
|
/datum/brain_trauma/severe/discoordination/on_lose()
|
||||||
|
owner.disabilities &= ~MONKEYLIKE
|
||||||
|
..()
|
||||||
114
code/datums/brain_damage/special.dm
Normal file
114
code/datums/brain_damage/special.dm
Normal file
@@ -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 = "<span class='notice'>You feel a higher power inside your mind...</span>"
|
||||||
|
lose_text = "<span class='warning'>The divine presence leaves your head, no longer interested.</span>"
|
||||||
|
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 = "<span class='notice'>You feel the bluespace pulsing around you...</span>"
|
||||||
|
lose_text = "<span class='warning'>The faint pulsing of bluespace fades into silence.</span>"
|
||||||
|
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, "<span class='notice'>You try to align with the bluespace stream...</span>")
|
||||||
|
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("<span class='warning'>[user] [slip_in_message].</span>", ignored_mob = user)
|
||||||
|
user.visible_message("<span class='warning'>[user] [slip_out_message].</span>", "<span class='notice'>...and find your way to the other side.</span>")
|
||||||
|
|
||||||
|
/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 = "<span class='warning'>You feel unhinged...</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel more balanced.</span>"
|
||||||
|
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, "<span class='notice'>But your martial knowledge keeps you grounded.</span>")
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/datum/brain_trauma/special/psychotic_brawling/on_lose()
|
||||||
|
..()
|
||||||
|
psychotic_brawling.remove(owner)
|
||||||
|
QDEL_NULL(psychotic_brawling)
|
||||||
218
code/datums/brain_damage/split_personality.dm
Normal file
218
code/datums/brain_damage/split_personality.dm
Normal file
@@ -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 = "<span class='warning'>You feel like your mind was split in two.</span>"
|
||||||
|
lose_text = "<span class='notice'>You feel alone again.</span>"
|
||||||
|
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, "<span class='userdanger'>You feel your control being taken away... your other personality is in charge now!</span>")
|
||||||
|
to_chat(current_backseat, "<span class='userdanger'>You manage to take control of your body!</span>")
|
||||||
|
|
||||||
|
//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, "<span class='notice'>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.</span>")
|
||||||
|
|
||||||
|
/mob/living/split_personality/say(message)
|
||||||
|
to_chat(src, "<span class='warning'>You cannot speak, your other self is controlling your body!</span>")
|
||||||
|
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 = "<span class='notice'>You are free of your brainwashing.</span>"
|
||||||
|
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, "<span class='warning'>[codeword]</span>")
|
||||||
|
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, "<span class='notice'>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.</span>")
|
||||||
|
to_chat(src, "<span class='notice'>Your activation codeword is: <b>[codeword]</b></span>")
|
||||||
|
if(objective)
|
||||||
|
to_chat(src, "<span class='notice'>Your master left you an objective: <b>[objective]</b>. Follow it at all costs when in control.</span>")
|
||||||
|
|
||||||
|
#undef OWNER
|
||||||
|
#undef STRANGER
|
||||||
@@ -962,6 +962,42 @@
|
|||||||
manipulate_organs(C)
|
manipulate_organs(C)
|
||||||
href_list["datumrefresh"] = href_list["editorgans"]
|
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"])
|
else if(href_list["hallucinate"])
|
||||||
if(!check_rights(0))
|
if(!check_rights(0))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ Bonus
|
|||||||
else
|
else
|
||||||
to_chat(M, "<span class='userdanger'>You can't think straight!</span>")
|
to_chat(M, "<span class='userdanger'>You can't think straight!</span>")
|
||||||
M.confused = min(100 * power, M.confused + 8)
|
M.confused = min(100 * power, M.confused + 8)
|
||||||
if(brain_damage && M.getBrainLoss()<=80)
|
if(brain_damage)
|
||||||
M.adjustBrainLoss(5 * power)
|
M.adjustBrainLoss(3 * power, 80)
|
||||||
M.updatehealth()
|
M.updatehealth()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -27,7 +27,9 @@ Bonus
|
|||||||
symptom_delay_max = 10
|
symptom_delay_max = 10
|
||||||
var/purge_alcohol = FALSE
|
var/purge_alcohol = FALSE
|
||||||
var/brain_heal = FALSE
|
var/brain_heal = FALSE
|
||||||
|
var/trauma_heal = FALSE
|
||||||
threshold_desc = "<b>Resistance 6:</b> Heals brain damage.<br>\
|
threshold_desc = "<b>Resistance 6:</b> Heals brain damage.<br>\
|
||||||
|
<b>Resistance 9:</b> Heals brain traumas.<br>\
|
||||||
<b>Transmission 8:</b> Purges alcohol in the bloodstream."
|
<b>Transmission 8:</b> Purges alcohol in the bloodstream."
|
||||||
|
|
||||||
/datum/symptom/mind_restoration/Start(datum/disease/advance/A)
|
/datum/symptom/mind_restoration/Start(datum/disease/advance/A)
|
||||||
@@ -35,6 +37,8 @@ Bonus
|
|||||||
return
|
return
|
||||||
if(A.properties["resistance"] >= 6) //heal brain damage
|
if(A.properties["resistance"] >= 6) //heal brain damage
|
||||||
brain_heal = TRUE
|
brain_heal = TRUE
|
||||||
|
if(A.properties["resistance"] >= 9) //heal brain traumas
|
||||||
|
trauma_heal = TRUE
|
||||||
if(A.properties["transmittable"] >= 8) //purge alcohol
|
if(A.properties["transmittable"] >= 8) //purge alcohol
|
||||||
purge_alcohol = TRUE
|
purge_alcohol = TRUE
|
||||||
|
|
||||||
@@ -65,4 +69,10 @@ Bonus
|
|||||||
M.hallucination = max(0, M.hallucination - 10)
|
M.hallucination = max(0, M.hallucination - 10)
|
||||||
|
|
||||||
if(brain_heal && A.stage >= 5)
|
if(brain_heal && A.stage >= 5)
|
||||||
M.adjustBrainLoss(-3)
|
M.adjustBrainLoss(-3)
|
||||||
|
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)
|
||||||
@@ -24,15 +24,15 @@
|
|||||||
if(prob(2))
|
if(prob(2))
|
||||||
to_chat(affected_mob, "<span class='danger'>You don't feel like yourself.</span>")
|
to_chat(affected_mob, "<span class='danger'>You don't feel like yourself.</span>")
|
||||||
if(prob(5))
|
if(prob(5))
|
||||||
affected_mob.adjustBrainLoss(1)
|
affected_mob.adjustBrainLoss(1, 170)
|
||||||
affected_mob.updatehealth()
|
affected_mob.updatehealth()
|
||||||
if(3)
|
if(3)
|
||||||
if(prob(2))
|
if(prob(2))
|
||||||
affected_mob.emote("stare")
|
affected_mob.emote("stare")
|
||||||
if(prob(2))
|
if(prob(2))
|
||||||
affected_mob.emote("drool")
|
affected_mob.emote("drool")
|
||||||
if(prob(10) && affected_mob.getBrainLoss()<=98)//shouldn't retard you to death now
|
if(prob(10))
|
||||||
affected_mob.adjustBrainLoss(2)
|
affected_mob.adjustBrainLoss(2, 170)
|
||||||
affected_mob.updatehealth()
|
affected_mob.updatehealth()
|
||||||
if(prob(2))
|
if(prob(2))
|
||||||
to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>")
|
to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>")
|
||||||
@@ -42,8 +42,8 @@
|
|||||||
affected_mob.emote("stare")
|
affected_mob.emote("stare")
|
||||||
if(prob(2))
|
if(prob(2))
|
||||||
affected_mob.emote("drool")
|
affected_mob.emote("drool")
|
||||||
if(prob(15) && affected_mob.getBrainLoss()<=98) //shouldn't retard you to death now
|
if(prob(15))
|
||||||
affected_mob.adjustBrainLoss(3)
|
affected_mob.adjustBrainLoss(3, 170)
|
||||||
affected_mob.updatehealth()
|
affected_mob.updatehealth()
|
||||||
if(prob(2))
|
if(prob(2))
|
||||||
to_chat(affected_mob, "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>")
|
to_chat(affected_mob, "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>")
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
|
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
|
||||||
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
|
||||||
D.SetSleeping(300)
|
D.SetSleeping(300)
|
||||||
D.adjustBrainLoss(25)
|
D.adjustBrainLoss(15, 150)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
/datum/martial_art/cqc/proc/Pressure(mob/living/carbon/human/A, mob/living/carbon/human/D)
|
||||||
|
|||||||
68
code/datums/martial/psychotic_brawl.dm
Normal file
68
code/datums/martial/psychotic_brawl.dm
Normal file
@@ -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("<span class='warning'>[A] violently grabs [D]!</span>", \
|
||||||
|
"<span class='userdanger'>[A] violently grabs you!</span>")
|
||||||
|
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("<span class='danger'>[A] [atk_verb] [D]!</span>", \
|
||||||
|
"<span class='userdanger'>[A] [atk_verb] you!</span>")
|
||||||
|
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("<span class='danger'>[A] [atk_verb] [D] with inhuman strength, sending [D.p_them()] flying backwards!</span>", \
|
||||||
|
"<span class='userdanger'>[A] [atk_verb] you with inhuman strength, sending you flying backwards!</span>")
|
||||||
|
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
|
||||||
@@ -240,7 +240,7 @@
|
|||||||
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking them out cold!</span>", \
|
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking them out cold!</span>", \
|
||||||
"<span class='userdanger'>[user] knocks you unconscious!</span>")
|
"<span class='userdanger'>[user] knocks you unconscious!</span>")
|
||||||
H.SetSleeping(600)
|
H.SetSleeping(600)
|
||||||
H.adjustBrainLoss(25)
|
H.adjustBrainLoss(15, 150)
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|||||||
@@ -95,13 +95,13 @@
|
|||||||
return trim(message)
|
return trim(message)
|
||||||
|
|
||||||
|
|
||||||
/datum/mutation/human/unintelligable
|
/datum/mutation/human/unintelligible
|
||||||
name = "Unintelligable"
|
name = "Unintelligible"
|
||||||
quality = NEGATIVE
|
quality = NEGATIVE
|
||||||
text_gain_indication = "<span class='danger'>You can't seem to form any coherent thoughts!</span>"
|
text_gain_indication = "<span class='danger'>You can't seem to form any coherent thoughts!</span>"
|
||||||
text_lose_indication = "<span class='danger'>Your mind feels more clear.</span>"
|
text_lose_indication = "<span class='danger'>Your mind feels more clear.</span>"
|
||||||
|
|
||||||
/datum/mutation/human/unintelligable/say_mod(message)
|
/datum/mutation/human/unintelligible/say_mod(message)
|
||||||
if(message)
|
if(message)
|
||||||
var/prefix=copytext(message,1,2)
|
var/prefix=copytext(message,1,2)
|
||||||
if(prefix == ";")
|
if(prefix == ";")
|
||||||
@@ -123,7 +123,7 @@
|
|||||||
suffix = copytext(cword,length(cword)-1,length(cword) )
|
suffix = copytext(cword,length(cword)-1,length(cword) )
|
||||||
if(length(cword))
|
if(length(cword))
|
||||||
rearranged += cword
|
rearranged += cword
|
||||||
message = "[prefix][uppertext(jointext(rearranged," "))]!!"
|
message ="[prefix][jointext(rearranged," ")]"
|
||||||
return message
|
return message
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -183,6 +183,7 @@
|
|||||||
to_chat(H, "<span class='warning'>You feel intensely watched.</span>")
|
to_chat(H, "<span class='warning'>You feel intensely watched.</span>")
|
||||||
sleep(5)
|
sleep(5)
|
||||||
to_chat(H, "<span class='warning'><b>Your mind snaps!</b></span>")
|
to_chat(H, "<span class='warning'><b>Your mind snaps!</b></span>")
|
||||||
|
H.gain_trauma_type(BRAIN_TRAUMA_MILD)
|
||||||
to_chat(H, "<big><span class='warning'><b>You can't remember how you got here...</b></span></big>")
|
to_chat(H, "<big><span class='warning'><b>You can't remember how you got here...</b></span></big>")
|
||||||
var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
|
var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
|
||||||
var/datum/objective/abductee/O = new objtype()
|
var/datum/objective/abductee/O = new objtype()
|
||||||
|
|||||||
@@ -684,7 +684,7 @@
|
|||||||
|
|
||||||
if(ishuman(user) && prob(40) && src.density)
|
if(ishuman(user) && prob(40) && src.density)
|
||||||
var/mob/living/carbon/human/H = user
|
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)
|
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
|
||||||
if(!istype(H.head, /obj/item/clothing/head/helmet))
|
if(!istype(H.head, /obj/item/clothing/head/helmet))
|
||||||
H.visible_message("<span class='danger'>[user] headbutts the airlock.</span>", \
|
H.visible_message("<span class='danger'>[user] headbutts the airlock.</span>", \
|
||||||
|
|||||||
@@ -168,6 +168,7 @@
|
|||||||
<font color="[patient.getFireLoss() < 60 ? "blue" : "red"]"><b>Burn Severity:</b> [patient.getFireLoss()]%</font><br />
|
<font color="[patient.getFireLoss() < 60 ? "blue" : "red"]"><b>Burn Severity:</b> [patient.getFireLoss()]%</font><br />
|
||||||
<font color="red">[patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]</font><br />
|
<font color="red">[patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]</font><br />
|
||||||
<font color="red">[patient.getBrainLoss() ? "Significant brain damage detected." : ""]</font><br />
|
<font color="red">[patient.getBrainLoss() ? "Significant brain damage detected." : ""]</font><br />
|
||||||
|
<font color="red">[length(patient.get_traumas()) ? "Brain Traumas detected." : ""]</font><br />
|
||||||
"}
|
"}
|
||||||
|
|
||||||
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents()
|
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents()
|
||||||
|
|||||||
@@ -246,6 +246,11 @@
|
|||||||
duration = 8
|
duration = 8
|
||||||
randomdir = 0
|
randomdir = 0
|
||||||
|
|
||||||
|
/obj/effect/temp_visual/bluespace_fissure
|
||||||
|
name = "bluespace fissure"
|
||||||
|
icon_state = "bluestream_fade"
|
||||||
|
duration = 9
|
||||||
|
|
||||||
/obj/effect/temp_visual/gib_animation
|
/obj/effect/temp_visual/gib_animation
|
||||||
icon = 'icons/mob/mob.dmi'
|
icon = 'icons/mob/mob.dmi'
|
||||||
duration = 15
|
duration = 15
|
||||||
|
|||||||
@@ -164,10 +164,6 @@ ARCD
|
|||||||
if (!ishuman(usr) && !usr.has_unlimited_silicon_privilege)
|
if (!ishuman(usr) && !usr.has_unlimited_silicon_privilege)
|
||||||
return ..(usr)
|
return ..(usr)
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = usr
|
|
||||||
if(H.getBrainLoss() >= 60)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/t1 = text("")
|
var/t1 = text("")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -545,7 +545,7 @@
|
|||||||
H.emote("gasp")
|
H.emote("gasp")
|
||||||
H.Jitter(100)
|
H.Jitter(100)
|
||||||
if(tplus > tloss)
|
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)
|
add_logs(user, H, "revived", defib)
|
||||||
if(req_defib)
|
if(req_defib)
|
||||||
defib.deductcharge(revivecost)
|
defib.deductcharge(revivecost)
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
add_fingerprint(user)
|
add_fingerprint(user)
|
||||||
if(istype(M) && on && user.zone_selected in list("eyes", "mouth"))
|
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
|
return ..() //just hit them in the head
|
||||||
|
|
||||||
if(!user.IsAdvancedToolUser())
|
if(!user.IsAdvancedToolUser())
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ GAS ANALYZER
|
|||||||
/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
|
/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user)
|
||||||
|
|
||||||
// Clumsiness/brain damage check
|
// Clumsiness/brain damage check
|
||||||
if ((user.disabilities & CLUMSY || user.getBrainLoss() >= 60) && prob(50))
|
if ((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||||
to_chat(user, "<span class='notice'>You stupidly try to analyze the floor's vitals!</span>")
|
to_chat(user, "<span class='notice'>You stupidly try to analyze the floor's vitals!</span>")
|
||||||
user.visible_message("<span class='warning'>[user] has analyzed the floor's vitals!</span>")
|
user.visible_message("<span class='warning'>[user] has analyzed the floor's vitals!</span>")
|
||||||
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: <b>Healthy</b>")
|
to_chat(user, "<span class='info'>Analyzing results for The floor:\n\tOverall status: <b>Healthy</b>")
|
||||||
@@ -145,14 +145,21 @@ GAS ANALYZER
|
|||||||
to_chat(user, "\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
|
to_chat(user, "\t<span class='alert'>Subject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.</span>")
|
||||||
if(advanced)
|
if(advanced)
|
||||||
to_chat(user, "\t<span class='info'>Cellular Damage Level: [M.getCloneLoss()].</span>")
|
to_chat(user, "\t<span class='info'>Cellular Damage Level: [M.getCloneLoss()].</span>")
|
||||||
if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain))
|
if (M.getBrainLoss() >= 200 || !M.getorgan(/obj/item/organ/brain))
|
||||||
to_chat(user, "\t<span class='alert'>Subject brain function is non-existent.</span>")
|
to_chat(user, "\t<span class='alert'>Subject brain function is non-existent.</span>")
|
||||||
else if (M.getBrainLoss() >= 60)
|
else if (M.getBrainLoss() >= 120)
|
||||||
to_chat(user, "\t<span class='alert'>Severe brain damage detected. Subject likely to have mental retardation.</span>")
|
to_chat(user, "\t<span class='alert'>Severe brain damage detected. Subject likely to have mental traumas.</span>")
|
||||||
else if (M.getBrainLoss() >= 10)
|
else if (M.getBrainLoss() >= 45)
|
||||||
to_chat(user, "\t<span class='alert'>Brain damage detected. Subject may have had a concussion.</span>")
|
to_chat(user, "\t<span class='alert'>Brain damage detected.</span>")
|
||||||
|
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, "\t<span class='alert'>Cerebral traumas detected: subjects appears to be suffering from [english_list(trauma_text)].</span>")
|
||||||
if(advanced)
|
if(advanced)
|
||||||
to_chat(user, "\t<span class='info'>Brain Activity Level: [100 - M.getBrainLoss()]%.</span>")
|
to_chat(user, "\t<span class='info'>Brain Activity Level: [(200 - M.getBrainLoss())/2]%.</span>")
|
||||||
if (M.radiation)
|
if (M.radiation)
|
||||||
to_chat(user, "\t<span class='alert'>Subject is irradiated.</span>")
|
to_chat(user, "\t<span class='alert'>Subject is irradiated.</span>")
|
||||||
if(advanced)
|
if(advanced)
|
||||||
|
|||||||
@@ -264,13 +264,13 @@
|
|||||||
name = "\improper DNA injector (Smile)"
|
name = "\improper DNA injector (Smile)"
|
||||||
add_mutations_static = list(SMILE)
|
add_mutations_static = list(SMILE)
|
||||||
|
|
||||||
/obj/item/dnainjector/unintelligablemut
|
/obj/item/dnainjector/unintelligiblemut
|
||||||
name = "\improper DNA injector (Unintelligable)"
|
name = "\improper DNA injector (Unintelligible)"
|
||||||
add_mutations_static = list(UNINTELLIGABLE)
|
add_mutations_static = list(UNINTELLIGIBLE)
|
||||||
|
|
||||||
/obj/item/dnainjector/antiunintelligable
|
/obj/item/dnainjector/antiunintelligible
|
||||||
name = "\improper DNA injector (Anti-Unintelligable)"
|
name = "\improper DNA injector (Anti-Unintelligible)"
|
||||||
remove_mutations_static = list(UNINTELLIGABLE)
|
remove_mutations_static = list(UNINTELLIGIBLE)
|
||||||
|
|
||||||
/obj/item/dnainjector/swedishmut
|
/obj/item/dnainjector/swedishmut
|
||||||
name = "\improper DNA injector (Swedish)"
|
name = "\improper DNA injector (Swedish)"
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible",
|
|||||||
else if(iscarbon(M))
|
else if(iscarbon(M))
|
||||||
var/mob/living/carbon/C = M
|
var/mob/living/carbon/C = M
|
||||||
if(!istype(C.head, /obj/item/clothing/head/helmet))
|
if(!istype(C.head, /obj/item/clothing/head/helmet))
|
||||||
C.adjustBrainLoss(10)
|
C.adjustBrainLoss(5, 60)
|
||||||
to_chat(C, "<span class='danger'>You feel dumber.</span>")
|
to_chat(C, "<span class='danger'>You feel dumber.</span>")
|
||||||
|
|
||||||
if(smack)
|
if(smack)
|
||||||
|
|||||||
@@ -439,7 +439,7 @@
|
|||||||
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage")
|
SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage")
|
||||||
for(var/mob/living/carbon/human/H in GLOB.player_list)
|
for(var/mob/living/carbon/human/H in GLOB.player_list)
|
||||||
to_chat(H, "<span class='boldannounce'>You suddenly feel stupid.</span>")
|
to_chat(H, "<span class='boldannounce'>You suddenly feel stupid.</span>")
|
||||||
H.setBrainLoss(60)
|
H.adjustBrainLoss(60, 80)
|
||||||
message_admins("[key_name_admin(usr)] made everybody retarded")
|
message_admins("[key_name_admin(usr)] made everybody retarded")
|
||||||
|
|
||||||
if("eagles")//SCRAW
|
if("eagles")//SCRAW
|
||||||
|
|||||||
@@ -1222,7 +1222,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
|
|||||||
target.electrocution_animation(40)
|
target.electrocution_animation(40)
|
||||||
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
||||||
if(ADMIN_PUNISHMENT_BRAINDAMAGE)
|
if(ADMIN_PUNISHMENT_BRAINDAMAGE)
|
||||||
target.adjustBrainLoss(75)
|
target.adjustBrainLoss(199, 199)
|
||||||
if(ADMIN_PUNISHMENT_GIB)
|
if(ADMIN_PUNISHMENT_GIB)
|
||||||
target.gib(FALSE)
|
target.gib(FALSE)
|
||||||
if(ADMIN_PUNISHMENT_BSA)
|
if(ADMIN_PUNISHMENT_BSA)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
if(!armed)
|
if(!armed)
|
||||||
if(ishuman(usr))
|
if(ishuman(usr))
|
||||||
var/mob/living/carbon/human/user = usr
|
var/mob/living/carbon/human/user = usr
|
||||||
if((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY && prob(50))
|
if((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||||
to_chat(user, "<span class='warning'>Your hand slips, setting off the trigger!</span>")
|
to_chat(user, "<span class='warning'>Your hand slips, setting off the trigger!</span>")
|
||||||
pulse(0)
|
pulse(0)
|
||||||
update_icon()
|
update_icon()
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
if(!armed)
|
if(!armed)
|
||||||
to_chat(user, "<span class='notice'>You arm [src].</span>")
|
to_chat(user, "<span class='notice'>You arm [src].</span>")
|
||||||
else
|
else
|
||||||
if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50))
|
if((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||||
var/which_hand = "l_hand"
|
var/which_hand = "l_hand"
|
||||||
if(!(user.active_hand_index % 2))
|
if(!(user.active_hand_index % 2))
|
||||||
which_hand = "r_hand"
|
which_hand = "r_hand"
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
|
|
||||||
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
|
/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user)
|
||||||
if(armed)
|
if(armed)
|
||||||
if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50))
|
if((user.disabilities & (CLUMSY | DUMB)) && prob(50))
|
||||||
var/which_hand = "l_hand"
|
var/which_hand = "l_hand"
|
||||||
if(!(user.active_hand_index % 2))
|
if(!(user.active_hand_index % 2))
|
||||||
which_hand = "r_hand"
|
which_hand = "r_hand"
|
||||||
|
|||||||
@@ -454,7 +454,7 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
|
|||||||
var/list/image/delusions = list()
|
var/list/image/delusions = list()
|
||||||
cost = 50
|
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/image/A = null
|
||||||
var/kind = force_kind ? force_kind : pick("monkey","corgi","carp","skeleton","demon","zombie")
|
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)
|
switch(kind)
|
||||||
if("monkey")//Monkey
|
if("monkey")//Monkey
|
||||||
A = image('icons/mob/monkey.dmi',H,"monkey1")
|
A = image('icons/mob/monkey.dmi',H,"monkey1")
|
||||||
|
A.name = "Monkey ([rand(1,999)])"
|
||||||
if("carp")//Carp
|
if("carp")//Carp
|
||||||
A = image('icons/mob/animal.dmi',H,"carp")
|
A = image('icons/mob/animal.dmi',H,"carp")
|
||||||
|
A.name = "Space Carp"
|
||||||
if("corgi")//Corgi
|
if("corgi")//Corgi
|
||||||
A = image('icons/mob/pets.dmi',H,"corgi")
|
A = image('icons/mob/pets.dmi',H,"corgi")
|
||||||
|
A.name = "Corgi"
|
||||||
if("skeleton")//Skeletons
|
if("skeleton")//Skeletons
|
||||||
A = image('icons/mob/human.dmi',H,"skeleton")
|
A = image('icons/mob/human.dmi',H,"skeleton")
|
||||||
|
A.name = "Skeleton"
|
||||||
if("zombie")//Zombies
|
if("zombie")//Zombies
|
||||||
A = image('icons/mob/human.dmi',H,"zombie")
|
A = image('icons/mob/human.dmi',H,"zombie")
|
||||||
|
A.name = "Zombie"
|
||||||
if("demon")//Demon
|
if("demon")//Demon
|
||||||
A = image('icons/mob/mob.dmi',H,"daemon")
|
A = image('icons/mob/mob.dmi',H,"daemon")
|
||||||
|
A.name = "Demon"
|
||||||
if("custom")
|
if("custom")
|
||||||
A = image(custom_icon_file, H, custom_icon)
|
A = image(custom_icon_file, H, custom_icon)
|
||||||
|
A.name = custom_name
|
||||||
A.override = 1
|
A.override = 1
|
||||||
if(target.client)
|
if(target.client)
|
||||||
delusions |= A
|
delusions |= A
|
||||||
target.client.images |= A
|
target.client.images |= A
|
||||||
QDEL_IN(src, duration)
|
if(duration)
|
||||||
|
QDEL_IN(src, duration)
|
||||||
|
|
||||||
/datum/hallucination/delusion/Destroy()
|
/datum/hallucination/delusion/Destroy()
|
||||||
for(var/image/I in delusions)
|
for(var/image/I in delusions)
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ Chaplain
|
|||||||
B.name = "Guys Gone Wild"
|
B.name = "Guys Gone Wild"
|
||||||
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks", "meme", "memes")
|
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")
|
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")
|
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")
|
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
|
else
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
var/damaged_brain = FALSE //whether the brain organ is damaged.
|
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/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
|
/obj/item/organ/brain/changeling_brain
|
||||||
vital = FALSE
|
vital = FALSE
|
||||||
decoy_override = TRUE
|
decoy_override = TRUE
|
||||||
@@ -40,11 +42,21 @@
|
|||||||
|
|
||||||
QDEL_NULL(brainmob)
|
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
|
//Update the body's icon so it doesnt appear debrained anymore
|
||||||
C.update_hair()
|
C.update_hair()
|
||||||
|
|
||||||
/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE)
|
/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)
|
if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer)
|
||||||
transfer_identity(C)
|
transfer_identity(C)
|
||||||
C.update_hair()
|
C.update_hair()
|
||||||
@@ -133,6 +145,30 @@
|
|||||||
else
|
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.
|
/obj/item/organ/brain/Destroy() //copypasted from MMIs.
|
||||||
if(brainmob)
|
if(brainmob)
|
||||||
qdel(brainmob)
|
qdel(brainmob)
|
||||||
@@ -143,3 +179,46 @@
|
|||||||
name = "alien brain"
|
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?"
|
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"
|
icon_state = "brain-x"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////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)
|
||||||
|
|||||||
@@ -22,4 +22,4 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/brain/set_blurriness()
|
/mob/living/brain/set_blurriness()
|
||||||
return
|
return
|
||||||
@@ -112,7 +112,8 @@
|
|||||||
take_bodypart_damage(10)
|
take_bodypart_damage(10)
|
||||||
victim.Knockdown(20)
|
victim.Knockdown(20)
|
||||||
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)
|
playsound(src,'sound/weapons/punch1.ogg',50,1)
|
||||||
|
|
||||||
|
|
||||||
@@ -765,6 +766,7 @@
|
|||||||
update_handcuffed()
|
update_handcuffed()
|
||||||
if(reagents)
|
if(reagents)
|
||||||
reagents.addiction_list = list()
|
reagents.addiction_list = list()
|
||||||
|
cure_all_traumas(TRUE, TRUE)
|
||||||
..()
|
..()
|
||||||
// heal ears after healing disabilities, since ears check DEAF disability
|
// heal ears after healing disabilities, since ears check DEAF disability
|
||||||
// when healing.
|
// when healing.
|
||||||
@@ -849,3 +851,5 @@
|
|||||||
.["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]"
|
.["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]"
|
||||||
.["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]"
|
.["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]"
|
||||||
.["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[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)]"
|
||||||
|
|||||||
@@ -228,7 +228,7 @@
|
|||||||
"<span class='danger'>[src] was shocked by \the [source]!</span>", \
|
"<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='userdanger'>You feel a powerful shock coursing through your body!</span>", \
|
||||||
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
||||||
)
|
)
|
||||||
jitteriness += 1000 //High numbers for violent convulsions
|
jitteriness += 1000 //High numbers for violent convulsions
|
||||||
do_jitter_animation(jitteriness)
|
do_jitter_animation(jitteriness)
|
||||||
stuttering += 2
|
stuttering += 2
|
||||||
|
|||||||
@@ -193,3 +193,37 @@
|
|||||||
staminaloss = amount
|
staminaloss = amount
|
||||||
if(updating_stamina)
|
if(updating_stamina)
|
||||||
update_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)
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
else
|
else
|
||||||
msg += "<b>[t_He] [t_is] severely deformed!</b>\n"
|
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"
|
msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n"
|
||||||
|
|
||||||
if(fire_stacks > 0)
|
if(fire_stacks > 0)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
var/t_has = p_have()
|
var/t_has = p_have()
|
||||||
var/t_is = p_are()
|
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/list/obscured = check_obscured_slots()
|
||||||
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
|
var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))
|
||||||
@@ -278,7 +278,7 @@
|
|||||||
if(stat == UNCONSCIOUS)
|
if(stat == UNCONSCIOUS)
|
||||||
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
|
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
|
||||||
else
|
else
|
||||||
if(getBrainLoss() >= 60)
|
if(disabilities & DUMB)
|
||||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||||
if(InCritical())
|
if(InCritical())
|
||||||
msg += "[t_He] [t_is] barely conscious.\n"
|
msg += "[t_He] [t_is] barely conscious.\n"
|
||||||
|
|||||||
@@ -103,7 +103,9 @@
|
|||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/IsAdvancedToolUser()
|
/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)
|
/mob/living/carbon/human/reagent_check(datum/reagent/R)
|
||||||
return dna.species.handle_chemicals(R,src)
|
return dna.species.handle_chemicals(R,src)
|
||||||
|
|||||||
@@ -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_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 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()
|
/mob/living/carbon/human/Life()
|
||||||
set invisibility = 0
|
set invisibility = 0
|
||||||
set background = BACKGROUND_ENABLED
|
set background = BACKGROUND_ENABLED
|
||||||
@@ -65,14 +63,6 @@
|
|||||||
else if(eye_blurry) //blurry eyes heal slowly
|
else if(eye_blurry) //blurry eyes heal slowly
|
||||||
adjust_blurriness(-1)
|
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()
|
/mob/living/carbon/human/handle_mutations_and_radiation()
|
||||||
if(!dna || !dna.species.handle_mutations_and_radiation(src))
|
if(!dna || !dna.species.handle_mutations_and_radiation(src))
|
||||||
..()
|
..()
|
||||||
@@ -413,7 +403,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>")
|
to_chat(src, "<span class='warning'>Maybe you should lie down for a bit...</span>")
|
||||||
|
|
||||||
if(drunkenness >= 91)
|
if(drunkenness >= 91)
|
||||||
adjustBrainLoss(0.4)
|
adjustBrainLoss(0.4, 60)
|
||||||
if(prob(20) && !stat)
|
if(prob(20) && !stat)
|
||||||
if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && (z in GLOB.station_z_levels)) //QoL mainly
|
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>")
|
to_chat(src, "<span class='warning'>You're so tired... but you can't miss that shuttle...</span>")
|
||||||
|
|||||||
@@ -1197,7 +1197,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
|||||||
add_logs(user, target, "punched")
|
add_logs(user, target, "punched")
|
||||||
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
|
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
|
||||||
target.visible_message("<span class='danger'>[user] has knocked [target] down!</span>", \
|
target.visible_message("<span class='danger'>[user] has knocked [target] down!</span>", \
|
||||||
"<span class='userdanger'>[user] has knocked [target] down!</span>")
|
"<span class='userdanger'>[user] has knocked [target] down!</span>", null, COMBAT_MESSAGE_RANGE)
|
||||||
target.apply_effect(80, KNOCKDOWN, armor_block)
|
target.apply_effect(80, KNOCKDOWN, armor_block)
|
||||||
target.forcesay(GLOB.hit_appends)
|
target.forcesay(GLOB.hit_appends)
|
||||||
else if(target.lying)
|
else if(target.lying)
|
||||||
@@ -1230,7 +1230,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
|||||||
if(randn <= 60)
|
if(randn <= 60)
|
||||||
var/obj/item/I = null
|
var/obj/item/I = null
|
||||||
if(target.pulling)
|
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()
|
target.stop_pulling()
|
||||||
else
|
else
|
||||||
I = target.get_active_held_item()
|
I = target.get_active_held_item()
|
||||||
@@ -1334,7 +1334,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
|||||||
H.visible_message("<span class='danger'>[H] has been knocked senseless!</span>", \
|
H.visible_message("<span class='danger'>[H] has been knocked senseless!</span>", \
|
||||||
"<span class='userdanger'>[H] has been knocked senseless!</span>")
|
"<span class='userdanger'>[H] has been knocked senseless!</span>")
|
||||||
H.confused = max(H.confused, 20)
|
H.confused = max(H.confused, 20)
|
||||||
|
H.adjustBrainLoss(20)
|
||||||
H.adjust_blurriness(10)
|
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)
|
if(prob(I.force + ((100 - H.health)/2)) && H != user)
|
||||||
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
|
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
amount = dna.species.spec_stun(src,amount)
|
amount = dna.species.spec_stun(src,amount)
|
||||||
return ..()
|
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)
|
amount = dna.species.spec_stun(src,amount)
|
||||||
return ..()
|
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)
|
amount = dna.species.spec_stun(src,amount)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,9 @@
|
|||||||
if(..()) //not dead
|
if(..()) //not dead
|
||||||
handle_blood()
|
handle_blood()
|
||||||
|
|
||||||
|
if(stat != DEAD)
|
||||||
|
handle_brain_damage()
|
||||||
|
|
||||||
if(stat != DEAD)
|
if(stat != DEAD)
|
||||||
handle_liver()
|
handle_liver()
|
||||||
|
|
||||||
@@ -437,3 +440,20 @@
|
|||||||
adjustToxLoss(8)
|
adjustToxLoss(8)
|
||||||
if(prob(30))
|
if(prob(30))
|
||||||
to_chat(src, "<span class='notice'>You feel confused and nauseous...</span>")//actual symptoms of liver failure
|
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
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
/mob/living/carbon/treat_message(message)
|
/mob/living/carbon/treat_message(message)
|
||||||
|
for(var/datum/brain_trauma/trauma in get_traumas())
|
||||||
|
message = trauma.on_say(message)
|
||||||
message = ..(message)
|
message = ..(message)
|
||||||
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
|
var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE)
|
||||||
if(!T) //hoooooouaah!
|
if(!T) //hoooooouaah!
|
||||||
@@ -35,3 +37,11 @@
|
|||||||
. = T.could_speak_in_language(dt)
|
. = T.could_speak_in_language(dt)
|
||||||
else
|
else
|
||||||
. = initial(dt.flags) & 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 ..()
|
||||||
@@ -101,3 +101,35 @@
|
|||||||
status_flags |= DISFIGURED //makes them unknown
|
status_flags |= DISFIGURED //makes them unknown
|
||||||
update_body()
|
update_body()
|
||||||
return 1
|
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)
|
||||||
|
|
||||||
|
|||||||
@@ -219,17 +219,13 @@
|
|||||||
return amount
|
return amount
|
||||||
|
|
||||||
/mob/living/proc/getBrainLoss()
|
/mob/living/proc/getBrainLoss()
|
||||||
return brainloss
|
. = 0
|
||||||
|
|
||||||
/mob/living/proc/adjustBrainLoss(amount)
|
/mob/living/proc/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH)
|
||||||
if(status_flags & GODMODE)
|
return
|
||||||
return 0
|
|
||||||
brainloss = Clamp((brainloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
|
||||||
|
|
||||||
/mob/living/proc/setBrainLoss(amount)
|
/mob/living/proc/setBrainLoss(amount)
|
||||||
if(status_flags & GODMODE)
|
return
|
||||||
return 0
|
|
||||||
brainloss = amount
|
|
||||||
|
|
||||||
/mob/living/proc/getStaminaLoss()
|
/mob/living/proc/getStaminaLoss()
|
||||||
return staminaloss
|
return staminaloss
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
var/toxloss = 0 //Toxic damage caused by being poisoned or radiated
|
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/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/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.
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -326,7 +326,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
|||||||
return null
|
return null
|
||||||
|
|
||||||
/mob/living/proc/treat_message(message)
|
/mob/living/proc/treat_message(message)
|
||||||
if(getBrainLoss() >= 60)
|
if(derpspeech)
|
||||||
message = derpspeech(message, stuttering)
|
message = derpspeech(message, stuttering)
|
||||||
|
|
||||||
if(stuttering)
|
if(stuttering)
|
||||||
@@ -373,7 +373,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
|||||||
. = "[verb_whisper] in [p_their()] last breath"
|
. = "[verb_whisper] in [p_their()] last breath"
|
||||||
else if(stuttering)
|
else if(stuttering)
|
||||||
. = "stammers"
|
. = "stammers"
|
||||||
else if(getBrainLoss() >= 60)
|
else if(derpspeech)
|
||||||
. = "gibbers"
|
. = "gibbers"
|
||||||
else
|
else
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|||||||
@@ -33,6 +33,13 @@
|
|||||||
|
|
||||||
sync_mind()
|
sync_mind()
|
||||||
|
|
||||||
|
//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)
|
||||||
|
|
||||||
update_client_colour()
|
update_client_colour()
|
||||||
if(client)
|
if(client)
|
||||||
client.click_intercept = null
|
client.click_intercept = null
|
||||||
|
|||||||
@@ -400,6 +400,7 @@
|
|||||||
pulling = null
|
pulling = null
|
||||||
grab_state = 0
|
grab_state = 0
|
||||||
update_pull_hud_icon()
|
update_pull_hud_icon()
|
||||||
|
|
||||||
if(isliving(ex_pulled))
|
if(isliving(ex_pulled))
|
||||||
var/mob/living/L = ex_pulled
|
var/mob/living/L = ex_pulled
|
||||||
L.update_canmove()// mob gets up if it was lyng down in a chokehold
|
L.update_canmove()// mob gets up if it was lyng down in a chokehold
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
var/stuttering = 0 //Carbon
|
var/stuttering = 0 //Carbon
|
||||||
var/slurring = 0 //Carbon
|
var/slurring = 0 //Carbon
|
||||||
var/cultslurring = 0 //Carbon
|
var/cultslurring = 0 //Carbon
|
||||||
|
var/derpspeech = 0 //Carbon
|
||||||
var/real_name = null
|
var/real_name = null
|
||||||
var/spacewalk = FALSE
|
var/spacewalk = FALSE
|
||||||
var/druggy = 0 //Carbon
|
var/druggy = 0 //Carbon
|
||||||
|
|||||||
@@ -79,6 +79,9 @@
|
|||||||
O.setBrainLoss(getBrainLoss(), 0)
|
O.setBrainLoss(getBrainLoss(), 0)
|
||||||
O.updatehealth()
|
O.updatehealth()
|
||||||
O.radiation = radiation
|
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
|
//re-add implants to new mob
|
||||||
if (tr_flags & TR_KEEPIMPLANTS)
|
if (tr_flags & TR_KEEPIMPLANTS)
|
||||||
@@ -238,6 +241,9 @@
|
|||||||
O.setBrainLoss(getBrainLoss(), 0)
|
O.setBrainLoss(getBrainLoss(), 0)
|
||||||
O.updatehealth()
|
O.updatehealth()
|
||||||
O.radiation = radiation
|
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
|
//re-add implants to new mob
|
||||||
if (tr_flags & TR_KEEPIMPLANTS)
|
if (tr_flags & TR_KEEPIMPLANTS)
|
||||||
|
|||||||
@@ -45,11 +45,6 @@
|
|||||||
to_chat(M, "<span class='boldnotice'>You feel that your soul has returned to its rightful owner, Nanotrasen.</span>")
|
to_chat(M, "<span class='boldnotice'>You feel that your soul has returned to its rightful owner, Nanotrasen.</span>")
|
||||||
M.return_soul()
|
M.return_soul()
|
||||||
else
|
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, "<span class='danger'>You feel dumber.</span>")
|
|
||||||
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", \
|
M.visible_message("<span class='danger'>[user] beats [M] over the head with [src]!</span>", \
|
||||||
"<span class='userdanger'>[user] beats [M] over the head with [src]!</span>")
|
"<span class='userdanger'>[user] beats [M] over the head with [src]!</span>")
|
||||||
return ..()
|
return ..()
|
||||||
@@ -207,7 +202,7 @@
|
|||||||
if(!user.mind.hasSoul)
|
if(!user.mind.hasSoul)
|
||||||
to_chat(user, "<span class='notice'>You do not possess a soul.</span>")
|
to_chat(user, "<span class='notice'>You do not possess a soul.</span>")
|
||||||
return 0
|
return 0
|
||||||
if(prob(user.getBrainLoss()))
|
if(user.disabilities & DUMB)
|
||||||
to_chat(user, "<span class='notice'>You quickly scrawl 'your name' on the contract.</span>")
|
to_chat(user, "<span class='notice'>You quickly scrawl 'your name' on the contract.</span>")
|
||||||
signIncorrectly()
|
signIncorrectly()
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -99,7 +99,7 @@
|
|||||||
. = 1
|
. = 1
|
||||||
|
|
||||||
/datum/reagent/drug/crank/addiction_act_stage4(mob/living/M)
|
/datum/reagent/drug/crank/addiction_act_stage4(mob/living/M)
|
||||||
M.adjustBrainLoss(5*REM)
|
M.adjustBrainLoss(3*REM)
|
||||||
M.adjustToxLoss(5*REM, 0)
|
M.adjustToxLoss(5*REM, 0)
|
||||||
M.adjustBruteLoss(5*REM, 0)
|
M.adjustBruteLoss(5*REM, 0)
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -628,7 +628,7 @@
|
|||||||
. = 1
|
. = 1
|
||||||
if(prob(20))
|
if(prob(20))
|
||||||
M.losebreath += 4
|
M.losebreath += 4
|
||||||
M.adjustBrainLoss(2*REM)
|
M.adjustBrainLoss(2*REM, 150)
|
||||||
M.adjustToxLoss(3*REM,0)
|
M.adjustToxLoss(3*REM,0)
|
||||||
M.adjustStaminaLoss(10*REM,0)
|
M.adjustStaminaLoss(10*REM,0)
|
||||||
M.blur_eyes(5)
|
M.blur_eyes(5)
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
M.confused = 0
|
M.confused = 0
|
||||||
M.SetSleeping(0, 0)
|
M.SetSleeping(0, 0)
|
||||||
M.jitteriness = 0
|
M.jitteriness = 0
|
||||||
|
M.cure_all_traumas(TRUE, TRUE)
|
||||||
for(var/thing in M.viruses)
|
for(var/thing in M.viruses)
|
||||||
var/datum/disease/D = thing
|
var/datum/disease/D = thing
|
||||||
if(D.severity == VIRUS_SEVERITY_POSITIVE)
|
if(D.severity == VIRUS_SEVERITY_POSITIVE)
|
||||||
@@ -777,7 +778,13 @@
|
|||||||
color = "#DCDCFF"
|
color = "#DCDCFF"
|
||||||
|
|
||||||
/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M)
|
/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
|
/datum/reagent/medicine/mutadone
|
||||||
@@ -1001,7 +1008,7 @@
|
|||||||
M.adjustFireLoss(-3 * REM, 0)
|
M.adjustFireLoss(-3 * REM, 0)
|
||||||
M.adjustOxyLoss(-15 * REM, 0)
|
M.adjustOxyLoss(-15 * REM, 0)
|
||||||
M.adjustToxLoss(-3 * 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.adjustCloneLoss(-1 * REM, 0)
|
||||||
M.adjustStaminaLoss(-30 * REM, 0)
|
M.adjustStaminaLoss(-30 * REM, 0)
|
||||||
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
|
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
|
||||||
@@ -1032,7 +1039,7 @@
|
|||||||
if (M.hallucination >= 5)
|
if (M.hallucination >= 5)
|
||||||
M.hallucination -= 5
|
M.hallucination -= 5
|
||||||
if(prob(20))
|
if(prob(20))
|
||||||
M.adjustBrainLoss(1*REM)
|
M.adjustBrainLoss(1*REM, 50)
|
||||||
M.adjustStaminaLoss(2.5*REM, 0)
|
M.adjustStaminaLoss(2.5*REM, 0)
|
||||||
..()
|
..()
|
||||||
. = 1
|
. = 1
|
||||||
|
|||||||
@@ -261,7 +261,7 @@
|
|||||||
M.adjustBruteLoss(-2, 0)
|
M.adjustBruteLoss(-2, 0)
|
||||||
M.adjustFireLoss(-2, 0)
|
M.adjustFireLoss(-2, 0)
|
||||||
else
|
else
|
||||||
M.adjustBrainLoss(3)
|
M.adjustBrainLoss(3, 150)
|
||||||
M.adjustToxLoss(1, 0)
|
M.adjustToxLoss(1, 0)
|
||||||
M.adjustFireLoss(2, 0)
|
M.adjustFireLoss(2, 0)
|
||||||
M.adjustOxyLoss(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.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.adjustToxLoss(1, 0)
|
||||||
M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard?
|
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)
|
holder.remove_reagent(src.id, 1)
|
||||||
|
|
||||||
/datum/reagent/medicine/omnizine/godblood
|
/datum/reagent/medicine/omnizine/godblood
|
||||||
@@ -676,7 +676,7 @@
|
|||||||
step(M, pick(GLOB.cardinals))
|
step(M, pick(GLOB.cardinals))
|
||||||
if(prob(5))
|
if(prob(5))
|
||||||
M.emote(pick("twitch","drool","moan"))
|
M.emote(pick("twitch","drool","moan"))
|
||||||
M.adjustBrainLoss(2)
|
M.adjustBrainLoss(1)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/reagent/sulfur
|
/datum/reagent/sulfur
|
||||||
@@ -1029,7 +1029,7 @@
|
|||||||
/datum/reagent/impedrezene/on_mob_life(mob/living/M)
|
/datum/reagent/impedrezene/on_mob_life(mob/living/M)
|
||||||
M.jitteriness = max(M.jitteriness-5,0)
|
M.jitteriness = max(M.jitteriness-5,0)
|
||||||
if(prob(80))
|
if(prob(80))
|
||||||
M.adjustBrainLoss(1*REM)
|
M.adjustBrainLoss(2*REM)
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
M.drowsyness = max(M.drowsyness, 3)
|
M.drowsyness = max(M.drowsyness, 3)
|
||||||
if(prob(10))
|
if(prob(10))
|
||||||
|
|||||||
@@ -455,13 +455,12 @@
|
|||||||
toxpwr = 0
|
toxpwr = 0
|
||||||
|
|
||||||
/datum/reagent/toxin/neurotoxin2/on_mob_life(mob/living/M)
|
/datum/reagent/toxin/neurotoxin2/on_mob_life(mob/living/M)
|
||||||
if(M.brainloss + M.toxloss <= 60)
|
M.adjustBrainLoss(3*REM, 150)
|
||||||
M.adjustBrainLoss(1*REM)
|
. = 1
|
||||||
|
if(M.toxloss <= 60)
|
||||||
M.adjustToxLoss(1*REM, 0)
|
M.adjustToxLoss(1*REM, 0)
|
||||||
. = 1
|
|
||||||
if(current_cycle >= 18)
|
if(current_cycle >= 18)
|
||||||
M.Sleeping(40, 0)
|
M.Sleeping(40, 0)
|
||||||
. = 1
|
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/reagent/toxin/cyanide
|
/datum/reagent/toxin/cyanide
|
||||||
|
|||||||
@@ -31,9 +31,8 @@
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
/obj/effect/proc_holder/spell/voice_of_god/cast(list/targets, mob/user = usr)
|
/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)
|
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)
|
charge_max = (cooldown * cooldown_mod)
|
||||||
|
|
||||||
/obj/effect/proc_holder/spell/voice_of_god/clown
|
/obj/effect/proc_holder/spell/voice_of_god/clown
|
||||||
|
|||||||
42
code/modules/surgery/brain_surgery.dm
Normal file
42
code/modules/surgery/brain_surgery.dm
Normal file
@@ -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, "<span class='warning'>It's hard to do surgery on someone's brain when they don't have one.</span>")
|
||||||
|
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.", "<span class='notice'>You begin to fix [target]'s brain...</span>")
|
||||||
|
|
||||||
|
/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!", "<span class='notice'>You succeed in fixing [target]'s brain.</span>")
|
||||||
|
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("<span class='warning'>[user] screws up, causing more damage!</span>", "<span class='warning'>You screw up, causing more damage!</span>")
|
||||||
|
target.adjustBrainLoss(80)
|
||||||
|
else
|
||||||
|
user.visible_message("<span class='warning'>[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore.", "<span class='warning'>You suddenly notice that the brain you were working on is not there anymore.</span>")
|
||||||
|
return FALSE
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
if(!E)
|
if(!E)
|
||||||
to_chat(user, "It's hard to do surgery on someone's eyes when they don't have any.")
|
to_chat(user, "It's hard to do surgery on someone's eyes when they don't have any.")
|
||||||
return FALSE
|
return FALSE
|
||||||
|
return TRUE
|
||||||
|
|
||||||
/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
/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.", "<span class='notice'>You begin to fix [target]'s eyes...</span>")
|
user.visible_message("[user] begins to fix [target]'s eyes.", "<span class='notice'>You begin to fix [target]'s eyes...</span>")
|
||||||
@@ -32,7 +33,7 @@
|
|||||||
/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
/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))
|
if(target.getorgan(/obj/item/organ/brain))
|
||||||
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain!</span>", "<span class='warning'>You accidentally stab [target] right in the brain!</span>")
|
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain!</span>", "<span class='warning'>You accidentally stab [target] right in the brain!</span>")
|
||||||
target.adjustBrainLoss(100)
|
target.adjustBrainLoss(70)
|
||||||
else
|
else
|
||||||
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.</span>", "<span class='warning'>You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.</span>")
|
user.visible_message("<span class='warning'>[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.</span>", "<span class='warning'>You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.</span>")
|
||||||
return FALSE
|
return FALSE
|
||||||
@@ -62,9 +62,13 @@
|
|||||||
H.stop_sound_channel(CHANNEL_HEARTBEAT)
|
H.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||||
beat = BEAT_NONE
|
beat = BEAT_NONE
|
||||||
|
|
||||||
if(H.jitteriness && H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW))
|
if(H.jitteriness)
|
||||||
H.playsound_local(get_turf(H),fastbeat,40,0, channel = CHANNEL_HEARTBEAT)
|
if(H.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW))
|
||||||
beat = BEAT_FAST
|
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
|
/obj/item/organ/heart/cursed
|
||||||
name = "cursed heart"
|
name = "cursed heart"
|
||||||
|
|||||||
@@ -249,7 +249,7 @@
|
|||||||
if(bz_pp > BZ_trip_balls_min)
|
if(bz_pp > BZ_trip_balls_min)
|
||||||
H.hallucination += 20
|
H.hallucination += 20
|
||||||
if(prob(33))
|
if(prob(33))
|
||||||
H.adjustBrainLoss(3)
|
H.adjustBrainLoss(3, 150)
|
||||||
else if(bz_pp > 0.01)
|
else if(bz_pp > 0.01)
|
||||||
H.hallucination += 5//Removed at 2 per tick so this will slowly build up
|
H.hallucination += 5//Removed at 2 per tick so this will slowly build up
|
||||||
|
|
||||||
|
|||||||
@@ -108,12 +108,11 @@
|
|||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/organ/vocal_cords/colossus/handle_speech(message)
|
/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)
|
playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 300, 1, 5)
|
||||||
return //voice of god speaks for us
|
return //voice of god speaks for us
|
||||||
|
|
||||||
/obj/item/organ/vocal_cords/colossus/speak_with(message)
|
/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)
|
next_command = world.time + (cooldown * cooldown_mod)
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
@@ -135,6 +134,8 @@
|
|||||||
else
|
else
|
||||||
span_list = list()
|
span_list = list()
|
||||||
|
|
||||||
|
user.say(message, spans = span_list, sanitize = FALSE)
|
||||||
|
|
||||||
message = lowertext(message)
|
message = lowertext(message)
|
||||||
var/mob/living/list/listeners = list()
|
var/mob/living/list/listeners = list()
|
||||||
for(var/mob/living/L in get_hearers_in_view(8, user))
|
for(var/mob/living/L in get_hearers_in_view(8, user))
|
||||||
|
|||||||
@@ -23,9 +23,6 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new)
|
|||||||
. = shared_ui_interaction(src_object)
|
. = shared_ui_interaction(src_object)
|
||||||
if(. > UI_CLOSE)
|
if(. > UI_CLOSE)
|
||||||
. = min(., shared_living_ui_distance(src_object)) // Check the distance...
|
. = 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)
|
/mob/living/silicon/robot/default_can_use_topic(src_object)
|
||||||
. = shared_ui_interaction(src_object)
|
. = shared_ui_interaction(src_object)
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 844 KiB After Width: | Height: | Size: 853 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 78 KiB |
63
strings/phobia.json
Normal file
63
strings/phobia.json
Normal file
@@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -230,6 +230,7 @@
|
|||||||
#include "code\controllers\subsystem\time_track.dm"
|
#include "code\controllers\subsystem\time_track.dm"
|
||||||
#include "code\controllers\subsystem\timer.dm"
|
#include "code\controllers\subsystem\timer.dm"
|
||||||
#include "code\controllers\subsystem\title.dm"
|
#include "code\controllers\subsystem\title.dm"
|
||||||
|
#include "code\controllers\subsystem\traumas.dm"
|
||||||
#include "code\controllers\subsystem\vote.dm"
|
#include "code\controllers\subsystem\vote.dm"
|
||||||
#include "code\controllers\subsystem\weather.dm"
|
#include "code\controllers\subsystem\weather.dm"
|
||||||
#include "code\controllers\subsystem\processing\circuit.dm"
|
#include "code\controllers\subsystem\processing\circuit.dm"
|
||||||
@@ -293,6 +294,12 @@
|
|||||||
#include "code\datums\antagonists\pirate.dm"
|
#include "code\datums\antagonists\pirate.dm"
|
||||||
#include "code\datums\antagonists\revolution.dm"
|
#include "code\datums\antagonists\revolution.dm"
|
||||||
#include "code\datums\antagonists\wizard.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\_component.dm"
|
||||||
#include "code\datums\components\archaeology.dm"
|
#include "code\datums\components\archaeology.dm"
|
||||||
#include "code\datums\components\chasm.dm"
|
#include "code\datums\components\chasm.dm"
|
||||||
@@ -376,6 +383,7 @@
|
|||||||
#include "code\datums\martial\cqc.dm"
|
#include "code\datums\martial\cqc.dm"
|
||||||
#include "code\datums\martial\krav_maga.dm"
|
#include "code\datums\martial\krav_maga.dm"
|
||||||
#include "code\datums\martial\plasma_fist.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\sleeping_carp.dm"
|
||||||
#include "code\datums\martial\wrestling.dm"
|
#include "code\datums\martial\wrestling.dm"
|
||||||
#include "code\datums\mutations\body.dm"
|
#include "code\datums\mutations\body.dm"
|
||||||
@@ -2267,6 +2275,7 @@
|
|||||||
#include "code\modules\stock_market\stockmarket.dm"
|
#include "code\modules\stock_market\stockmarket.dm"
|
||||||
#include "code\modules\stock_market\stocks.dm"
|
#include "code\modules\stock_market\stocks.dm"
|
||||||
#include "code\modules\surgery\amputation.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\cavity_implant.dm"
|
||||||
#include "code\modules\surgery\core_removal.dm"
|
#include "code\modules\surgery\core_removal.dm"
|
||||||
#include "code\modules\surgery\dental_implant.dm"
|
#include "code\modules\surgery\dental_implant.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user