mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 13:37:58 +01:00
Merge remote-tracking branch 'ParadiseSS13/master' into brutal-part1
This commit is contained in:
@@ -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)
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user