Merge remote-tracking branch 'ParadiseSS13/master' into brutal-part1

This commit is contained in:
AffectedArc07
2021-03-11 18:41:17 +00:00
1118 changed files with 25570 additions and 65816 deletions
+1 -82
View File
@@ -6,77 +6,12 @@
slot = "eye_sight"
parent_organ = "eyes"
w_class = WEIGHT_CLASS_TINY
var/vision_flags = 0
var/see_in_dark = 0
var/see_invisible = 0
var/lighting_alpha
var/eye_colour = "#000000" // Should never be null
var/old_eye_colour = "#000000"
var/flash_protect = 0
var/aug_message = "Your vision is augmented!"
/obj/item/organ/internal/cyberimp/eyes/insert(mob/living/carbon/M, special = 0)
/obj/item/organ/internal/cyberimp/eyes/insert(mob/living/carbon/M, special = FALSE)
..()
var/mob/living/carbon/human/H = M
if(istype(H) && eye_colour)
H.update_body() //Apply our eye colour to the target.
if(aug_message && !special)
to_chat(owner, "<span class='notice'>[aug_message]</span>")
M.update_sight()
/obj/item/organ/internal/cyberimp/eyes/remove(mob/living/carbon/M, special = 0)
. = ..()
M.update_sight()
/obj/item/organ/internal/cyberimp/eyes/proc/generate_icon(mob/living/carbon/human/HA)
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes)
cybereyes_icon.Blend(eye_colour, ICON_ADD) // Eye implants override native DNA eye color
return cybereyes_icon
/obj/item/organ/internal/cyberimp/eyes/emp_act(severity)
if(!owner || emp_proof)
return
if(severity > 1)
if(prob(10 * severity))
return
to_chat(owner, "<span class='warning'>Static obfuscates your vision!</span>")
owner.flash_eyes(visual = 1)
/obj/item/organ/internal/cyberimp/eyes/meson
name = "Meson scanner implant"
desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else."
eye_colour = "#199900"
implant_color = "#AEFF00"
origin_tech = "materials=4;engineering=4;biotech=4;magnets=4"
vision_flags = SEE_TURFS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
aug_message = "Suddenly, you realize how much of a mess the station really is..."
/obj/item/organ/internal/cyberimp/eyes/xray
name = "X-ray implant"
desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile."
implant_color = "#000000"
origin_tech = "materials=4;programming=4;biotech=7;magnets=4"
vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
/obj/item/organ/internal/cyberimp/eyes/thermals
name = "Thermals implant"
desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included."
eye_colour = "#FFCC00"
implant_color = "#FFCC00"
vision_flags = SEE_MOBS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
flash_protect = -1
origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1"
aug_message = "You see prey everywhere you look..."
// HUD implants
/obj/item/organ/internal/cyberimp/eyes/hud
@@ -104,7 +39,6 @@
/obj/item/organ/internal/cyberimp/eyes/hud/medical
name = "Medical HUD implant"
desc = "These cybernetic eye implants will display a medical HUD over everything you see."
eye_colour = "#0000D0"
implant_color = "#00FFFF"
origin_tech = "materials=4;programming=4;biotech=4"
aug_message = "You suddenly see health bars floating above people's heads..."
@@ -114,7 +48,6 @@
/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic
name = "Diagnostic HUD implant"
desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see."
eye_colour = "#723E02"
implant_color = "#ff9000"
origin_tech = "materials=4;engineering=4;biotech=4"
aug_message = "You see the diagnostic information of the synthetics around you..."
@@ -123,22 +56,8 @@
/obj/item/organ/internal/cyberimp/eyes/hud/security
name = "Security HUD implant"
desc = "These cybernetic eye implants will display a security HUD over everything you see."
eye_colour = "#D00000"
implant_color = "#CC0000"
origin_tech = "materials=4;programming=4;biotech=3;combat=3"
aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..."
HUD_type = DATA_HUD_SECURITY_ADVANCED
examine_extensions = list(EXAMINE_HUD_SECURITY_READ, EXAMINE_HUD_SECURITY_WRITE)
// Welding shield implant
/obj/item/organ/internal/cyberimp/eyes/shield
name = "welding shield implant"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
slot = "eye_shield"
origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3"
implant_color = "#101010"
flash_protect = 2
// Welding with thermals will still hurt your eyes a bit.
/obj/item/organ/internal/cyberimp/eyes/shield/emp_act(severity)
return
@@ -9,9 +9,9 @@
/obj/item/organ/internal/cyberimp/New(mob/M = null)
. = ..()
if(implant_overlay)
var/image/overlay = new /image(icon, implant_overlay)
var/mutable_appearance/overlay = mutable_appearance(icon, implant_overlay)
overlay.color = implant_color
overlays |= overlay
add_overlay(overlay)
/obj/item/organ/internal/cyberimp/emp_act()
return // These shouldn't be hurt by EMPs in the standard way
@@ -215,6 +215,14 @@
slot = "brain_clownvoice"
origin_tech = "materials=2;biotech=2"
/obj/item/organ/internal/cyberimp/brain/clown_voice/insert(mob/living/carbon/M, special = FALSE)
..()
ADD_TRAIT(M, TRAIT_COMIC_SANS, "augment")
/obj/item/organ/internal/cyberimp/brain/clown_voice/remove(mob/living/carbon/M, special = FALSE)
REMOVE_TRAIT(M, TRAIT_COMIC_SANS, "augment")
return ..()
/obj/item/organ/internal/cyberimp/brain/speech_translator //actual translating done in human/handle_speech_problems
name = "Speech translator implant"
desc = "While known as a translator, this implant actually generates speech based on the user's thoughts when activated, completely bypassing the need to speak."
@@ -245,7 +253,7 @@
crit_fail = FALSE
if(owner)
to_chat(owner, "<span class='notice'>Your translator implant beeps.</span>")
SEND_SOUND(owner, 'sound/machines/twobeep.ogg')
SEND_SOUND(owner, sound('sound/machines/twobeep.ogg'))
/obj/item/organ/internal/cyberimp/brain/speech_translator/ui_action_click()
if(owner && crit_fail)
@@ -397,26 +405,18 @@
//BOX O' IMPLANTS
/obj/item/storage/box/cyber_implants
name = "boxed cybernetic implant"
name = "boxed cybernetic implants"
desc = "A sleek, sturdy box."
icon_state = "cyber_implants"
/obj/item/storage/box/cyber_implants/New(loc, implant)
..()
new /obj/item/autoimplanter(src)
if(ispath(implant))
new implant(src)
/obj/item/storage/box/cyber_implants/bundle
name = "boxed cybernetic implants"
var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals,
/obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver/hardened)
var/list/boxed = list(
/obj/item/autosurgeon/organ/syndicate/thermal_eyes,
/obj/item/autosurgeon/organ/syndicate/xray_eyes,
/obj/item/autosurgeon/organ/syndicate/anti_stun,
/obj/item/autosurgeon/organ/syndicate/reviver)
var/amount = 5
/obj/item/storage/box/cyber_implants/bundle/New()
..()
/obj/item/storage/box/cyber_implants/populate_contents()
var/implant
while(amount > 0)
while(length(contents) <= amount)
implant = pick(boxed)
new implant(src)
amount--
@@ -1,37 +0,0 @@
/obj/item/autoimplanter
name = "autoimplanter"
desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants."
icon = 'icons/obj/device.dmi'
icon_state = "autoimplanter"
item_state = "walkietalkie"//left as this so as to intentionally not have inhands
w_class = WEIGHT_CLASS_SMALL
usesound = 'sound/weapons/circsawhit.ogg'
var/obj/item/organ/internal/cyberimp/storedorgan
/obj/item/autoimplanter/attack_self(mob/user)//when the object it used...
if(!storedorgan)
to_chat(user, "<span class='notice'>[src] currently has no implant stored.</span>")
return
storedorgan.insert(user)//insert stored organ into the user
user.visible_message("<span class='notice'>[user] presses a button on [src], and you hear a short mechanical noise.</span>", "<span class='notice'>You feel a sharp sting as [src] plunges into your body.</span>")
playsound(get_turf(user), usesound, 50, 1)
storedorgan = null
/obj/item/autoimplanter/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/organ/internal/cyberimp))
if(storedorgan)
to_chat(user, "<span class='notice'>[src] already has an implant stored.</span>")
return
if(!user.drop_item())
return
I.forceMove(src)
storedorgan = I
to_chat(user, "<span class='notice'>You insert the [I] into [src].</span>")
else if(istype(I, /obj/item/screwdriver))
if(!storedorgan)
to_chat(user, "<span class='notice'>There's no implant in [src] for you to remove.</span>")
else
storedorgan.forceMove(get_turf(user))
storedorgan = null
to_chat(user, "<span class='notice'>You remove the [storedorgan] from [src].</span>")
playsound(get_turf(user), I.usesound, 50, 1)
+103
View File
@@ -0,0 +1,103 @@
#define INFINITE -1
/obj/item/autosurgeon
name = "autosurgeon"
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a screwdriver slot for removing accidentally added items."
icon = 'icons/obj/device.dmi'
icon_state = "autoimplanter"
item_state = ""
w_class = WEIGHT_CLASS_SMALL
var/uses = INFINITE
/obj/item/autosurgeon/attack_self_tk(mob/user)
return //stops TK fuckery
/obj/item/autosurgeon/organ
name = "implant autosurgeon"
desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert implants or organs and a screwdriver slot for removing accidentally added items."
var/organ_type = /obj/item/organ/internal
var/starting_organ
var/obj/item/organ/internal/storedorgan
/obj/item/autosurgeon/organ/syndicate
name = "suspicious implant autosurgeon"
icon_state = "syndicate_autoimplanter"
/obj/item/autosurgeon/organ/Initialize(mapload)
. = ..()
if(starting_organ)
insert_organ(new starting_organ(src))
/obj/item/autosurgeon/organ/proc/insert_organ(obj/item/I)
storedorgan = I
I.forceMove(src)
name = "[initial(name)] ([storedorgan.name])"
/obj/item/autosurgeon/organ/attack_self(mob/user) //when the object it used...
if(!uses)
to_chat(user, "<span class='alert'>[src] has already been used. The tools are dull and won't reactivate.</span>")
return
else if(!storedorgan)
to_chat(user, "<span class='alert'>[src] currently has no implant stored.</span>")
return
storedorgan.insert(user) //insert stored organ into the user
user.visible_message("<span class='notice'>[user] presses a button on [src], and you hear a short mechanical noise.</span>", "<span class='notice'>You feel a sharp sting as [src] plunges into your body.</span>")
playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, TRUE)
storedorgan = null
name = initial(name)
if(uses != INFINITE)
uses--
if(!uses)
desc = "[initial(desc)] Looks like it's been used up."
/obj/item/autosurgeon/organ/attackby(obj/item/I, mob/user, params)
if(istype(I, organ_type))
if(storedorgan)
to_chat(user, "<span class='alert'>[src] already has an implant stored.</span>")
return
else if(!uses)
to_chat(user, "<span class='alert'>[src] has already been used up.</span>")
return
if(!user.drop_item())
return
I.forceMove(src)
storedorgan = I
to_chat(user, "<span class='notice'>You insert [I] into [src].</span>")
else
return ..()
/obj/item/autosurgeon/organ/screwdriver_act(mob/living/user, obj/item/I)
if(..())
return TRUE
if(!storedorgan)
to_chat(user, "<span class='warning'>There's no implant in [src] for you to remove!</span>")
else
storedorgan.forceMove(user.drop_location())
to_chat(user, "<span class='notice'>You remove [storedorgan] from [src].</span>")
I.play_tool_sound(src)
storedorgan = null
if(uses != INFINITE)
uses--
if(!uses)
desc = "[initial(desc)] Looks like it's been used up."
return TRUE
/obj/item/autosurgeon/organ/syndicate/laser_arm
desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in."
uses = 1
starting_organ = /obj/item/organ/internal/cyberimp/arm/gun/laser
/obj/item/autosurgeon/organ/syndicate/thermal_eyes
starting_organ = /obj/item/organ/internal/eyes/cybernetic/thermals
/obj/item/autosurgeon/organ/syndicate/xray_eyes
starting_organ = /obj/item/organ/internal/eyes/cybernetic/xray
/obj/item/autosurgeon/organ/syndicate/anti_stun
starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stun/hardened
/obj/item/autosurgeon/organ/syndicate/reviver
starting_organ = /obj/item/organ/internal/cyberimp/chest/reviver/hardened
#undef INFINITE
+5 -4
View File
@@ -22,7 +22,7 @@
bleed_rate = 0
return
if(bodytemperature >= TCRYO && !(NOCLONE in mutations)) //cryosleep or husked people do not pump the blood.
if(bodytemperature >= TCRYO && !HAS_TRAIT(src, TRAIT_BADDNA)) //cryosleep or husked people do not pump the blood.
if(blood_volume < BLOOD_VOLUME_NORMAL)
blood_volume += 0.1 // regenerate blood VERY slowly
@@ -74,10 +74,10 @@
var/additional_bleed = round(clamp((reagents.get_reagent_amount("heparin") / 10), 0, 2), 1) //Heparin worsens existing bleeding
if(internal_bleeding_rate && !(status_flags & FAKEDEATH))
if(internal_bleeding_rate && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
bleed_internal(internal_bleeding_rate + additional_bleed)
if(bleed_rate && !bleedsuppress && !(status_flags & FAKEDEATH))
if(bleed_rate && !bleedsuppress && !HAS_TRAIT(src, TRAIT_FAKEDEATH))
bleed(bleed_rate + additional_bleed)
//Makes a blood drop, leaking amt units of blood from the mob
@@ -91,6 +91,7 @@
add_splatter_floor(loc, 1)
/mob/living/carbon/human/bleed(amt)
amt *= physiology.bleed_mod
if(!(NO_BLOOD in dna.species.species_traits))
..()
if(dna.species.exotic_blood)
@@ -224,7 +225,7 @@
/mob/living/carbon/human/get_blood_id()
if(dna.species.exotic_blood)//some races may bleed water..or kethcup..
return dna.species.exotic_blood
else if((NO_BLOOD in dna.species.species_traits) || (NOCLONE in mutations))
else if((NO_BLOOD in dna.species.species_traits) || HAS_TRAIT(src, TRAIT_HUSK))
return
return "blood"
+6 -6
View File
@@ -12,19 +12,19 @@
/obj/item/organ/internal/body_egg/insert(mob/living/carbon/M, special = 0)
..()
owner.status_flags |= XENO_HOST
ADD_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC)
ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune")
START_PROCESSING(SSobj, src)
owner.med_hud_set_status()
spawn(0)
AddInfectionImages(owner)
INVOKE_ASYNC(src, .proc/AddInfectionImages, owner)
/obj/item/organ/internal/body_egg/remove(mob/living/carbon/M, special = 0)
STOP_PROCESSING(SSobj, src)
if(owner)
owner.status_flags &= ~(XENO_HOST)
REMOVE_TRAIT(owner, TRAIT_XENO_HOST, TRAIT_GENERIC)
REMOVE_TRAIT(owner, TRAIT_XENO_IMMUNE, "xeno immune")
owner.med_hud_set_status()
spawn(0)
RemoveInfectionImages(owner)
INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner)
. = ..()
/obj/item/organ/internal/body_egg/process()
+25 -27
View File
@@ -13,39 +13,41 @@
// the person will not have either `deaf` or `ear_damage` decrease
// without external aid (earmuffs, drugs)
var/ear_damage = 0
// Multiplier for both long term and short term ear damage
var/damage_multiplier = 1
/obj/item/organ/internal/ears/on_life()
if(!iscarbon(owner))
return
var/mob/living/carbon/C = owner
// genetic deafness prevents the body from using the ears, even if healthy
if(DEAF in C.mutations)
deaf = max(deaf, 1)
if(ear_damage < 100)
AdjustEarDamage(-0.1)
// if we have non-damage related deafness like mutations, quirks or clothing (earmuffs), don't bother processing here. Ear healing from earmuffs or chems happen elsewhere
if(HAS_TRAIT_NOT_FROM(C, TRAIT_DEAF, EAR_DAMAGE))
return
if(ear_damage >= 100)
deaf = max(deaf, 1) // if we're failing we always have at least 1 deaf stack (and thus deafness)
else
if(ishuman(C))
var/mob/living/carbon/human/H = C
if((H.l_ear && H.l_ear.flags_2 & HEALS_EARS_2) || (H.r_ear && H.r_ear.flags_2 & HEALS_EARS_2))
deaf = max(deaf - 1, 1)
ear_damage = max(ear_damage - 0.10, 0)
// if higher than UNHEALING_EAR_DAMAGE, no natural healing occurs.
if(ear_damage < UNHEALING_EAR_DAMAGE)
ear_damage = max(ear_damage - 0.05, 0)
deaf = max(deaf - 1, 0)
deaf = max(deaf - 1, 0)
if((ear_damage > 10) && prob(ear_damage / 30))
AdjustEarDamage(0, 4)
SEND_SOUND(owner, sound('sound/weapons/flash_ring.ogg'))
if(deaf)
ADD_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE)
else
REMOVE_TRAIT(owner, TRAIT_DEAF, EAR_DAMAGE)
/obj/item/organ/internal/ears/proc/RestoreEars()
deaf = 0
ear_damage = 0
var/mob/living/carbon/C = owner
if(istype(C) && (DEAF in C.mutations))
deaf = 1
/obj/item/organ/internal/ears/proc/AdjustEarDamage(ddmg, ddeaf)
ear_damage = max(ear_damage + ddmg, 0)
deaf = max(deaf + ddeaf, 0)
/obj/item/organ/internal/ears/proc/MinimumDeafTicks(value)
deaf = max(deaf, value)
ear_damage = clamp(ear_damage + (ddmg * damage_multiplier), 0, 100)
deaf = max(deaf + (ddeaf * damage_multiplier), 0)
/obj/item/organ/internal/ears/surgeryize()
RestoreEars()
@@ -61,20 +63,16 @@
if(ears)
ears.AdjustEarDamage(ddmg, ddeaf)
/mob/living/carbon/MinimumDeafTicks(value)
var/obj/item/organ/internal/ears/ears = get_int_organ(/obj/item/organ/internal/ears)
if(ears)
ears.MinimumDeafTicks(value)
/obj/item/organ/internal/ears/cybernetic
name = "cybernetic ears"
icon_state = "ears-c"
desc = "a basic cybernetic designed to mimic the operation of ears."
origin_tech = "biotech=4"
status = ORGAN_ROBOT
damage_multiplier = 0.9
/obj/item/organ/internal/ears/cybernetic/emp_act(severity)
if(emp_proof)
return
..()
AdjustEarDamage(30, 120)
ear_damage += 40 / severity
+126 -17
View File
@@ -5,17 +5,19 @@
organ_tag = "eyes"
parent_organ = "head"
slot = "eyes"
var/eye_colour = "#000000" // Should never be null
var/eye_color = "#000000" // Should never be null
var/list/colourmatrix = null
var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white.
var/list/replace_colours = GREYSCALE_COLOR_REPLACE
var/dependent_disabilities = list() //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation.
var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will.
var/weld_proof = FALSE //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will.
var/vision_flags = 0
var/see_in_dark = 2
var/tint = 0
var/flash_protect = FLASH_PROTECTION_NONE
var/see_invisible = SEE_INVISIBLE_LIVING
var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
var/lighting_alpha
/obj/item/organ/internal/eyes/proc/update_colour()
dna.write_eyes_attributes(src)
@@ -25,12 +27,12 @@
if(!istype(H))
H = owner
var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes)
eyes_icon.Blend(eye_colour, ICON_ADD)
eyes_icon.Blend(eye_color, ICON_ADD)
return eyes_icon
/obj/item/organ/internal/eyes/proc/get_colourmatrix() //Returns a special colour matrix if the eyes are organic and the mob is colourblind, otherwise it uses the current one.
if(!is_robotic() && (COLOURBLIND in owner.mutations))
if(!is_robotic() && HAS_TRAIT(owner, TRAIT_COLORBLIND))
return colourblind_matrix
else
return colourmatrix
@@ -41,32 +43,63 @@
/obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0)
..()
if(istype(M) && eye_colour)
if(istype(M) && eye_color)
M.update_body() //Apply our eye colour to the target.
if(!(COLOURBLIND in M.mutations) && (COLOURBLIND in dependent_disabilities)) //If the eyes are colourblind and we're not, carry over the gene.
dependent_disabilities -= COLOURBLIND
M.dna.SetSEState(GLOB.colourblindblock,1)
genemutcheck(M,GLOB.colourblindblock,null,MUTCHK_FORCED)
M.update_tint()
M.update_sight()
if(!HAS_TRAIT(M, TRAIT_COLORBLIND) && (TRAIT_COLORBLIND in dependent_disabilities)) //If the eyes are colourblind and we're not, carry over the gene.
dependent_disabilities -= TRAIT_COLORBLIND
M.dna.SetSEState(GLOB.colourblindblock, TRUE)
singlemutcheck(M, GLOB.colourblindblock, MUTCHK_FORCED)
else
M.update_client_colour() //If we're here, that means the mob acquired the colourblindness gene while they didn't have eyes. Better handle it.
/obj/item/organ/internal/eyes/remove(mob/living/carbon/human/M, special = 0)
if(!special && (COLOURBLIND in M.mutations)) //If special is set, that means these eyes are getting deleted (i.e. during set_species())
if(!(COLOURBLIND in dependent_disabilities)) //We only want to change COLOURBLINDBLOCK and such it the eyes are being surgically removed.
dependent_disabilities |= COLOURBLIND
M.dna.SetSEState(GLOB.colourblindblock,0)
genemutcheck(M,GLOB.colourblindblock,null,MUTCHK_FORCED)
if(!special && HAS_TRAIT(M, TRAIT_COLORBLIND)) //If special is set, that means these eyes are getting deleted (i.e. during set_species())
if(!(TRAIT_COLORBLIND in dependent_disabilities)) //We only want to change COLOURBLINDBLOCK and such it the eyes are being surgically removed.
dependent_disabilities |= TRAIT_COLORBLIND
M.dna.SetSEState(GLOB.colourblindblock, FALSE)
singlemutcheck(M, GLOB.colourblindblock, MUTCHK_FORCED)
. = ..()
M.update_tint()
M.update_sight()
/obj/item/organ/internal/eyes/surgeryize()
if(!owner)
return
owner.CureNearsighted()
owner.CureBlind()
owner.cure_nearsighted(EYE_DAMAGE)
owner.cure_blind(EYE_DAMAGE)
owner.SetEyeBlurry(0)
owner.SetEyeBlind(0)
/obj/item/organ/internal/eyes/night_vision
name = "shadow eyes"
desc = "A spooky set of eyes that can see in the dark."
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
actions_types = list(/datum/action/item_action/organ_action/use)
/obj/item/organ/internal/eyes/night_vision/ui_action_click()
vision_flags = initial(vision_flags)
switch(lighting_alpha)
if(LIGHTING_PLANE_ALPHA_VISIBLE)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
if(LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE)
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
if(LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE)
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
else
lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE
vision_flags &= ~SEE_BLACKNESS
owner.update_sight()
/obj/item/organ/internal/eyes/night_vision/nightmare
name = "burning red eyes"
desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread."
icon_state = "burning_eyes"
/obj/item/organ/internal/eyes/robotize(make_tough)
colourmatrix = null
..() //Make sure the organ's got the robotic status indicators before updating the client colour.
@@ -79,3 +112,79 @@
desc = "An electronic device designed to mimic the functions of a pair of human eyes. It has no benefits over organic eyes, but is easy to produce."
origin_tech = "biotech=4"
status = ORGAN_ROBOT
/obj/item/organ/internal/eyes/cybernetic/emp_act(severity)
if(!owner || emp_proof)
return
if(prob(10 * severity))
return
to_chat(owner, "<span class='warning'>Static obfuscates your vision!</span>")
owner.flash_eyes(visual = TRUE)
..()
/obj/item/organ/internal/eyes/cybernetic/meson
name = "meson eyes"
desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else."
eye_color = "#199900"
vision_flags = SEE_TURFS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
origin_tech = "materials=4;engineering=4;biotech=4;magnets=4"
/obj/item/organ/internal/eyes/cybernetic/xray
name = "\improper X-ray eyes"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
see_in_dark = 8
vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS
origin_tech = "materials=4;programming=4;biotech=7;magnets=4"
/obj/item/organ/internal/eyes/cybernetic/thermals
name = "thermal eyes"
desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included."
eye_color = "#FFCC00"
vision_flags = SEE_MOBS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
flash_protect = FLASH_PROTECTION_SENSITIVE
see_in_dark = 8
origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1"
/obj/item/organ/internal/eyes/cybernetic/flashlight
name = "flashlight eyes"
desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?"
eye_color ="#FEE5A3"
icon = 'icons/obj/lighting.dmi'
icon_state = "flashlight_eyes"
flash_protect = FLASH_PROTECTION_WELDER
tint = INFINITY
var/obj/item/flashlight/eyelight/eye
/obj/item/organ/internal/eyes/cybernetic/flashlight/emp_act(severity)
return
/obj/item/organ/internal/eyes/cybernetic/flashlight/insert(mob/living/carbon/M, special = FALSE)
..()
if(!eye)
eye = new /obj/item/flashlight/eyelight()
eye.on = TRUE
eye.forceMove(M)
eye.update_brightness(M)
M.become_blind("flashlight_eyes")
/obj/item/organ/internal/eyes/cybernetic/flashlight/remove(mob/living/carbon/M, special = FALSE)
if(eye)
eye.on = FALSE
eye.update_brightness(M)
eye.forceMove(src)
M.cure_blind("flashlight_eyes")
. = ..()
// Welding shield implant
/obj/item/organ/internal/eyes/cybernetic/shield
name = "shielded robotic eyes"
desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision."
flash_protect = FLASH_PROTECTION_WELDER
eye_color = "#101010"
origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3"
/obj/item/organ/internal/eyes/cybernetic/shield/emp_act(severity)
return
+13 -1
View File
@@ -155,6 +155,17 @@
dead_icon = "heart-c-u-off"
var/attempted_restart = FALSE
/obj/item/organ/internal/heart/cybernetic/upgraded/insert(mob/living/carbon/M, special = FALSE)
..()
RegisterSignal(M, COMSIG_LIVING_MINOR_SHOCK, .proc/shock_heart)
RegisterSignal(M, COMSIG_LIVING_ELECTROCUTE_ACT, .proc/shock_heart)
/obj/item/organ/internal/heart/cybernetic/upgraded/remove(mob/living/carbon/M, special = FALSE)
UnregisterSignal(M, COMSIG_LIVING_MINOR_SHOCK)
UnregisterSignal(M, COMSIG_LIVING_ELECTROCUTE_ACT)
return ..()
/obj/item/organ/internal/heart/cybernetic/upgraded/on_life()
if(!ishuman(owner))
return
@@ -234,8 +245,9 @@
return
necrotize()
/obj/item/organ/internal/heart/cybernetic/upgraded/proc/shock_heart(mob/living/carbon/human/source, intensity)
SIGNAL_HANDLER_DOES_SLEEP
/obj/item/organ/internal/heart/cybernetic/upgraded/shock_organ(intensity)
if(!ishuman(owner))
return
if(emp_proof)
+6 -7
View File
@@ -87,8 +87,11 @@
if((H.status_flags & GODMODE))
return
if(HAS_TRAIT(H, TRAIT_NOBREATH))
return
if(!breath || (breath.total_moles() == 0))
if(isspaceturf(loc))
if(isspaceturf(H.loc))
H.adjustOxyLoss(10)
else
H.adjustOxyLoss(5)
@@ -267,11 +270,7 @@
/obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
var/breath_temperature = breath.temperature
var/species_traits = list()
if(H && H.dna.species && H.dna.species.species_traits)
species_traits = H.dna.species.species_traits
if(!(COLDRES in H.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
if(!HAS_TRAIT(H, TRAIT_RESISTCOLD)) // COLD DAMAGE
var/CM = abs(H.dna.species.coldmod)
var/TC = 0
if(breath_temperature < cold_level_3_threshold)
@@ -287,7 +286,7 @@
if(prob(20))
to_chat(H, "<span class='warning'>You feel [cold_message] in your [name]!</span>")
if(!(HEATRES in H.mutations) && !(RESISTHOT in species_traits)) // HEAT DAMAGE
if(!HAS_TRAIT(H, TRAIT_RESISTHEAT)) // HEAT DAMAGE
var/HM = abs(H.dna.species.heatmod)
var/TH = 0
if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
+3 -6
View File
@@ -100,7 +100,7 @@
return
//Process infections
if(is_robotic() || sterile || (owner && (NO_GERMS in owner.dna.species.species_traits)))
if(is_robotic() || sterile || (owner && HAS_TRAIT(owner, TRAIT_NOGERMS)))
germ_level = 0
return
@@ -230,10 +230,7 @@
status &= ~ORGAN_SPLINTED
status |= ORGAN_ROBOT
/obj/item/organ/proc/shock_organ(intensity)
return
/obj/item/organ/proc/remove(mob/living/user,special = 0)
/obj/item/organ/proc/remove(mob/living/user, special = 0)
if(!istype(owner))
return
@@ -242,7 +239,7 @@
var/obj/item/organ/external/affected = owner.get_organ(parent_organ)
if(affected) affected.internal_organs -= src
loc = get_turf(owner)
forceMove(get_turf(owner))
START_PROCESSING(SSobj, src)
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
+5 -12
View File
@@ -7,7 +7,6 @@
max_damage = 0
dir = SOUTH
organ_tag = "limb"
flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2 // On Para, external organs have a loc, ergo they need this.
var/brute_mod = 1
var/burn_mod = 1
@@ -19,7 +18,6 @@
var/force_icon
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
var/damage_state = "00"
var/brute_dam = 0
@@ -109,7 +107,6 @@
..()
var/mob/living/carbon/human/H = holder
icobase = dna.species.icobase
deform = dna.species.deform
if(istype(H))
replaced(H)
sync_colour_to_human(H)
@@ -117,7 +114,7 @@
/obj/item/organ/external/replaced(mob/living/carbon/human/target)
owner = target
forceMove(owner)
loc = null
if(istype(owner))
if(!isnull(owner.bodyparts_by_name[limb_name]))
log_debug("Duplicate organ in slot \"[limb_name]\", mob '[target]'")
@@ -229,7 +226,7 @@
check_fracture(brute)
var/mob/living/carbon/owner_old = owner //Need to update health, but need a reference in case the below check cuts off a limb.
//If limb took enough damage, try to cut or tear it off
if(owner && loc == owner)
if(owner)
if(!cannot_amputate && (brute_dam) >= (max_damage))
if(prob(brute / 2))
if(sharp)
@@ -616,7 +613,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"<span class='danger'>Something feels like it shattered in your [name]!</span>",\
"You hear a sickening crack.")
playsound(owner, "bonebreak", 150, 1)
if(owner.dna.species && !(NO_PAIN in owner.dna.species.species_traits))
if(!HAS_TRAIT(owner, TRAIT_NOPAIN))
owner.emote("scream")
status |= ORGAN_BROKEN
@@ -674,14 +671,10 @@ Note that amputating the affected organ does in fact remove the infection from t
desc = "[R.desc]"
/obj/item/organ/external/proc/mutate()
src.status |= ORGAN_MUTATED
if(owner)
owner.update_body(TRUE) //Forces all bodyparts to update in order to correctly render the deformed sprite.
status |= ORGAN_MUTATED
/obj/item/organ/external/proc/unmutate()
src.status &= ~ORGAN_MUTATED
if(owner)
owner.update_body(TRUE) //Forces all bodyparts to update in order to correctly return them to normal.
status &= ~ORGAN_MUTATED
/obj/item/organ/external/proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
+5 -9
View File
@@ -14,15 +14,14 @@ GLOBAL_LIST_EMPTY(limb_icon_cache)
overlays += organ.mob_icon
child_icons += organ.mob_icon
/obj/item/organ/external/proc/change_organ_icobase(new_icobase, new_deform, owner_sensitive) //Change the icobase/deform of this organ. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs.
if(owner_sensitive) //This and the below statements mean that the icobase/deform will only get updated if the limb is the same species as and is owned by the mob it's attached to.
/obj/item/organ/external/proc/change_organ_icobase(new_icobase, owner_sensitive) //Change the icobase of this organ. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs.
if(owner_sensitive) //This and the below statements mean that the icobase will only get updated if the limb is the same species as and is owned by the mob it's attached to.
if(dna.species && owner.dna.species && dna.species.name != owner.dna.species.name)
return
if(dna.unique_enzymes != owner.dna.unique_enzymes) // This isn't MY arm
return
icobase = new_icobase ? new_icobase : icobase
deform = new_deform ? new_deform : deform
/obj/item/organ/external/proc/sync_colour_to_human(mob/living/carbon/human/H)
if(is_robotic() && !istype(dna.species, /datum/species/machine)) //machine people get skin color
@@ -41,7 +40,7 @@ GLOBAL_LIST_EMPTY(limb_icon_cache)
s_col = H.skin_colour
if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
var/obj/item/organ/external/chest/C = H.get_organ("chest")
change_organ_icobase(C.icobase, C.deform)
change_organ_icobase(C.icobase)
/obj/item/organ/external/proc/sync_colour_to_dna()
if(is_robotic())
@@ -180,11 +179,8 @@ GLOBAL_LIST_EMPTY(limb_icon_cache)
else if(is_robotic())
icon_file = 'icons/mob/human_races/robotic.dmi'
else
if(status & ORGAN_MUTATED)
icon_file = deform
else
// Congratulations, you are normal
icon_file = icobase
// Congratulations, you are normal
icon_file = icobase
return list(icon_file, new_icon_state)
// new damage icon system
+12 -17
View File
@@ -239,25 +239,20 @@
/obj/item/organ/internal/honktumor/insert(mob/living/carbon/M, special = 0)
..()
M.mutations.Add(CLUMSY)
M.mutations.Add(GLOB.comicblock)
M.dna.SetSEState(GLOB.clumsyblock,1,1)
M.dna.SetSEState(GLOB.comicblock,1,1)
genemutcheck(M,GLOB.clumsyblock,null,MUTCHK_FORCED)
genemutcheck(M,GLOB.comicblock,null,MUTCHK_FORCED)
M.dna.SetSEState(GLOB.clumsyblock, TRUE, TRUE)
M.dna.SetSEState(GLOB.comicblock, TRUE, TRUE)
singlemutcheck(M, GLOB.clumsyblock, MUTCHK_FORCED)
singlemutcheck(M, GLOB.comicblock, MUTCHK_FORCED)
organhonked = world.time
M.AddElement(/datum/element/waddling)
squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50)
squeak = M.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg' = 1), 50, falloff_exponent = 20)
/obj/item/organ/internal/honktumor/remove(mob/living/carbon/M, special = 0)
. = ..()
M.mutations.Remove(CLUMSY)
M.mutations.Remove(GLOB.comicblock)
M.dna.SetSEState(GLOB.clumsyblock,0)
M.dna.SetSEState(GLOB.comicblock,0)
genemutcheck(M,GLOB.clumsyblock,null,MUTCHK_FORCED)
genemutcheck(M,GLOB.comicblock,null,MUTCHK_FORCED)
M.dna.SetSEState(GLOB.clumsyblock, FALSE)
M.dna.SetSEState(GLOB.comicblock, FALSE)
singlemutcheck(M, GLOB.clumsyblock, MUTCHK_FORCED)
singlemutcheck(M, GLOB.comicblock, MUTCHK_FORCED)
M.RemoveElement(/datum/element/waddling)
QDEL_NULL(squeak)
qdel(src)
@@ -268,9 +263,9 @@
to_chat(owner, "<font color='red' size='7'>HONK</font>")
owner.SetSleeping(0)
owner.Stuttering(20)
owner.MinimumDeafTicks(30)
owner.AdjustEarDamage(0, 30)
owner.Weaken(3)
owner << 'sound/items/airhorn.ogg'
SEND_SOUND(owner, sound('sound/items/airhorn.ogg'))
if(prob(30))
owner.Stun(10)
owner.Paralyse(4)
@@ -309,7 +304,7 @@
/obj/item/organ/internal/honkbladder/insert(mob/living/carbon/M, special = 0)
squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50)
squeak = M.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20)
/obj/item/organ/internal/honkbladder/remove(mob/living/carbon/M, special = 0)
. = ..()
+2 -2
View File
@@ -34,7 +34,7 @@
if(stat >= UNCONSCIOUS)
return
if(NO_PAIN in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_NOPAIN))
return
if(reagents.has_reagent("morphine"))
return
@@ -54,7 +54,7 @@
if(stat >= UNCONSCIOUS)
return
if(NO_PAIN in dna.species.species_traits)
if(HAS_TRAIT(src, TRAIT_NOPAIN))
return
if(reagents.has_reagent("morphine"))
return
+5 -5
View File
@@ -52,9 +52,13 @@
var/egg_progress = 0 // # of on_life() cycles completed, unlike cycle_num this is reset on each hatch event
var/egg_progress_per_hatch = 90 // if egg_progress > this, chance to hatch and reset egg_progress
var/eggs_hatched = 0 // num of hatch events completed
var/awaymission_checked = FALSE
var/awaymission_infection = FALSE // TRUE if infection occurred inside gateway
/obj/item/organ/internal/body_egg/terror_eggs/Initialize(mapload)
. = ..()
var/turf/T = get_turf(src)
if(istype(T) && is_away_level(T.z))
awaymission_infection = TRUE
/obj/item/organ/internal/body_egg/terror_eggs/on_life()
// Safety first.
@@ -67,10 +71,6 @@
egg_progress += calc_variable_progress()
// Detect & stop people attempting to bring a gateway white spider infection back to the main station.
if(!awaymission_checked)
awaymission_checked = TRUE
if(is_away_level(owner.z))
awaymission_infection = TRUE
if(awaymission_infection)
var/turf/T = get_turf(owner)
if(istype(T) && !is_away_level(T.z))
@@ -49,8 +49,7 @@
colour = BlendRGB(owner.m_colours["body"], owner.m_colours["head"], 0.65) //then again im pretty bad at theoretics
if(new_light != glowing)
var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ))
lbody.set_light(new_light,l_color = colour)
owner.set_light(new_light, l_color = colour)
glowing = new_light
return
@@ -73,14 +72,12 @@
if(!glowing)
var/light = calculate_glow(KIDAN_LANTERN_LIGHT)
var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ))
lbody.set_light(light,l_color = colour)
owner.set_light(light, l_color = colour)
glowing = light
return 1
else
var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ))
lbody.set_light(0)
owner.set_light(0)
glowing = 0
return 1
@@ -118,7 +118,7 @@
icon_state = "camera"
status = ORGAN_ROBOT
// dead_icon = "camera_broken"
weld_proof = 1
weld_proof = TRUE
/obj/item/organ/internal/eyes/optical_sensor/remove(mob/living/user,special = 0)
if(!special)
@@ -1,3 +0,0 @@
/obj/item/organ/internal/eyes/shadow
name = "dark orbs"
see_in_dark = 8
+25 -27
View File
@@ -9,34 +9,34 @@
icon = 'icons/obj/species_organs/skrell.dmi'
icon_state = "skrell_headpocket"
origin_tech = "biotech=2"
w_class = WEIGHT_CLASS_TINY
w_class = WEIGHT_CLASS_SMALL
parent_organ = "head"
slot = "headpocket"
actions_types = list(/datum/action/item_action/organ_action/toggle)
var/obj/item/storage/internal/pocket
var/obj/item/held_item
/obj/item/organ/internal/headpocket/New()
..()
pocket = new /obj/item/storage/internal(src)
pocket.storage_slots = 1
// Allow adjacency calculation to work properly
loc = owner
// Fit only pocket sized items
pocket.max_w_class = WEIGHT_CLASS_SMALL
pocket.max_combined_w_class = 2
/obj/item/organ/internal/headpocket/Destroy()
QDEL_NULL(held_item)
return ..()
/obj/item/organ/internal/headpocket/on_life()
..()
var/obj/item/organ/external/head/head = owner.get_organ("head")
if(pocket.contents.len && !findtextEx(head.h_style, "Tentacles"))
owner.visible_message("<span class='notice'>Something falls from [owner]'s head!</span>",
"<span class='notice'>Something falls from your head!</span>")
if(held_item && !findtextEx(head.h_style, "Tentacles"))
owner.visible_message("<span class='notice'>[held_item] falls from [owner]'s [name]!</span>", "<span class='notice'>[held_item] falls from your [name]!</span>")
empty_contents()
/obj/item/organ/internal/headpocket/ui_action_click()
if(!loc)
loc = owner
pocket.MouseDrop(owner)
if(held_item)
owner.visible_message("<span class='notice'>[owner] removes [held_item] from [owner.p_their()] [name].</span>", "<span class='notice'>You remove [held_item] from your [name].</span>")
owner.put_in_hands(held_item)
held_item = null
else
var/obj/item/I = owner.get_active_hand()
if(I && I.w_class <= WEIGHT_CLASS_SMALL && !istype(I, /obj/item/disk/nuclear) && owner.unEquip(I))
owner.visible_message("<span class='notice'>[owner] places [I] into [owner.p_their()] [name].</span>", "<span class='notice'>You place [I] into your [name].</span>")
I.forceMove(src)
held_item = I
/obj/item/organ/internal/headpocket/on_owner_death()
empty_contents()
@@ -46,22 +46,20 @@
. = ..()
/obj/item/organ/internal/headpocket/proc/empty_contents()
for(var/obj/item/I in pocket.contents)
pocket.remove_from_storage(I, get_turf(owner))
/obj/item/organ/internal/headpocket/proc/get_contents()
return pocket.contents
if(held_item)
held_item.forceMove(get_turf(owner))
held_item = null
/obj/item/organ/internal/headpocket/emp_act(severity)
pocket.emp_act(severity)
held_item.emp_act(severity)
..()
/obj/item/organ/internal/headpocket/hear_talk(mob/living/M as mob, list/message_pieces)
pocket.hear_talk(M, message_pieces)
/obj/item/organ/internal/headpocket/hear_talk(mob/living/M, list/message_pieces)
held_item.hear_talk(M, message_pieces)
..()
/obj/item/organ/internal/headpocket/hear_message(mob/living/M as mob, msg)
pocket.hear_message(M, msg)
/obj/item/organ/internal/headpocket/hear_message(mob/living/M, msg)
held_item.hear_message(M, msg)
..()
/obj/item/organ/internal/heart/skrell
@@ -125,11 +125,13 @@
M.faction |= "alien"
M.add_language("Hivemind")
M.add_language("Xenomorph")
ADD_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune")
/obj/item/organ/internal/xenos/hivenode/remove(mob/living/carbon/M, special = 0)
M.faction -= "alien"
M.remove_language("Hivemind")
M.remove_language("Xenomorph")
REMOVE_TRAIT(M, TRAIT_XENO_IMMUNE, "xeno immune")
. = ..()
/obj/item/organ/internal/xenos/neurotoxin
@@ -188,12 +188,6 @@ GLOBAL_DATUM_INIT(multispin_words, /regex, regex("like a record baby"))
for(var/V in listeners)
var/mob/living/L = V
if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename))
var/start = findtext(message, L.mind.devilinfo.truename)
listeners = list(L) //let's be honest you're never going to find two devils with the same name
power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
//Cut out the name so it doesn't trigger commands
message = copytext(message, 0, start)+copytext(message, start + length(L.mind.devilinfo.truename), length(message) + 1)
if(findtext(message, L.real_name) == 1)
specific_listeners += L //focus on those with the specified name
//Cut out the name so it doesn't trigger commands