Tweaks to previous commits.

More tweaks to IPC fixes.
Merge resolution/compile fixes.

Further work on properly integrating, updating and fixing prosthetic options.

Repathed internal organs to organ/internal.

More work on full synthetics, changelings, overheating.

Working on getting organs to qdel properly and spawn properly when robotized.

Finalized some overheating values, added remaining prosthetic icons.

Finalizing the testing version of the full prosthetic bodies branch.

Added suit cyclers to the autolathe and map.

Fixing runtime errors.

Fixing errors.

Changelog.

Replacing limb and organ strings with constants.

Prevented brainless species from becoming full cyborgs.

Fixed issues with brain/MMIs renaming themselves inappropriately.

Various fixes and oversights.
This commit is contained in:
Zuhayr
2015-12-04 16:49:21 +10:30
parent 87afd2feb2
commit f93ea6a78f
161 changed files with 1384 additions and 1352 deletions
@@ -97,33 +97,33 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/organ_name = null
switch(name)
if("torso")
if(BP_TORSO)
organ_name = "torso"
if("groin")
if(BP_GROIN)
organ_name = "groin"
if("head")
if(BP_HEAD)
organ_name = "head"
if("l_arm")
if(BP_L_ARM)
organ_name = "left arm"
if("r_arm")
if(BP_R_ARM)
organ_name = "right arm"
if("l_leg")
if(BP_L_LEG)
organ_name = "left leg"
if("r_leg")
if(BP_R_LEG)
organ_name = "right leg"
if("l_foot")
if(BP_L_FOOT)
organ_name = "left foot"
if("r_foot")
if(BP_R_FOOT)
organ_name = "right foot"
if("l_hand")
if(BP_L_HAND)
organ_name = "left hand"
if("r_hand")
if(BP_R_HAND)
organ_name = "right hand"
if("heart")
if(O_HEART)
organ_name = "heart"
if("eyes")
if(O_EYES)
organ_name = "eyes"
if("brain")
if(O_BRAIN)
organ_name = "brain"
if(status == "cyborg")
@@ -351,56 +351,73 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return TOPIC_REFRESH
else if(href_list["limbs"])
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand","Full Body")
if(!limb_name && !CanUseTopic(user)) return TOPIC_NOACTION
var/list/limb_selection_list = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand","Full Body")
// Full prosthetic bodies without a brain are borderline unkillable so make sure they have a brain to remove/destroy.
var/datum/species/current_species = all_species[pref.species]
if(!current_species.has_organ["brain"])
limb_selection_list -= "Full Body"
var/organ_tag = input(user, "Which limb do you want to change?") as null|anything in limb_selection_list
if(!organ_tag && !CanUseTopic(user)) return TOPIC_NOACTION
var/limb = null
var/second_limb = null // if you try to change the arm, the hand should also change
var/third_limb = null // if you try to unchange the hand, the arm should also change
switch(limb_name)
// Do not let them amputate their entire body, ty.
var/list/choice_options = list("Normal","Amputated","Prothesis")
switch(organ_tag)
if("Left Leg")
limb = "l_leg"
second_limb = "l_foot"
limb = BP_L_LEG
second_limb = BP_L_FOOT
if("Right Leg")
limb = "r_leg"
second_limb = "r_foot"
limb = BP_R_LEG
second_limb = BP_R_FOOT
if("Left Arm")
limb = "l_arm"
second_limb = "l_hand"
limb = BP_L_ARM
second_limb = BP_L_HAND
if("Right Arm")
limb = "r_arm"
second_limb = "r_hand"
limb = BP_R_ARM
second_limb = BP_R_HAND
if("Left Foot")
limb = "l_foot"
third_limb = "l_leg"
limb = BP_L_FOOT
third_limb = BP_L_LEG
if("Right Foot")
limb = "r_foot"
third_limb = "r_leg"
limb = BP_R_FOOT
third_limb = BP_R_LEG
if("Left Hand")
limb = "l_hand"
third_limb = "l_arm"
limb = BP_L_HAND
third_limb = BP_L_ARM
if("Right Hand")
limb = "r_hand"
third_limb = "r_arm"
limb = BP_R_HAND
third_limb = BP_R_ARM
if("Full Body")
limb = "torso"
limb = BP_TORSO
third_limb = BP_GROIN
choice_options = list("Normal","Prothesis")
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis")
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in choice_options
if(!new_state && !CanUseTopic(user)) return TOPIC_NOACTION
switch(new_state)
if("Normal")
if(limb == BP_TORSO)
for(var/other_limb in BP_ALL - BP_TORSO)
pref.organ_data[other_limb] = null
pref.rlimb_data[other_limb] = null
pref.organ_data[limb] = null
pref.rlimb_data[limb] = null
if(third_limb)
pref.organ_data[third_limb] = null
pref.rlimb_data[third_limb] = null
if("Amputated")
if(limb == "torso")
if(limb == BP_TORSO)
return
pref.organ_data[limb] = "amputated"
pref.rlimb_data[limb] = null
if(second_limb)
@@ -430,43 +447,45 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(third_limb && pref.organ_data[third_limb] == "amputated")
pref.organ_data[third_limb] = null
if(limb == "torso")
for(var/other_limb in list("l_foot","r_foot","l_hand","r_hand","l_leg","r_leg","l_arm","r_arm","groin","head"))
if(limb == BP_TORSO)
for(var/other_limb in BP_ALL - BP_TORSO)
if(pref.organ_data[other_limb])
continue
pref.organ_data[other_limb] = "cyborg"
pref.rlimb_data[other_limb] = choice
if(!pref.organ_data["brain"])
pref.organ_data["brain"] = "assisted"
for(var/internal_organ in list("heart","eyes"))
if(!pref.organ_data[O_BRAIN])
pref.organ_data[O_BRAIN] = "assisted"
for(var/internal_organ in list(O_HEART,O_EYES))
pref.organ_data[internal_organ] = "mechanical"
return TOPIC_REFRESH
else if(href_list["organs"])
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Brain")
if(!organ_name) return
var/organ = null
switch(organ_name)
if("Heart")
organ = "heart"
organ = O_HEART
if("Eyes")
organ = "eyes"
organ = O_EYES
if("Brain")
if(pref.organ_data["head"] != "cyborg")
if(pref.organ_data[BP_HEAD] != "cyborg")
user << "<span class='warning'>You may only select an assisted or synthetic brain if you have a full prosthetic body.</span>"
return
organ = "brain"
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical")
var/list/organ_choices = list("Normal","Assisted","Mechanical")
if(pref.organ_data[BP_TORSO] == "cyborg")
organ_choices -= "Normal"
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices
if(!new_state) return
switch(new_state)
if("Normal")
if(pref.organ_data["torso"] == "cyborg")
user << "<span class='warning'>A character with a synthetic body may only use synthetic organs.</span>"
return
pref.organ_data[organ] = null
if("Assisted")
pref.organ_data[organ] = "assisted"
@@ -512,9 +531,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
dat += "</br><b>Often present on human stations.</b>"
if(current_species.spawn_flags & IS_WHITELISTED)
dat += "</br><b>Whitelist restricted.</b>"
if(!current_species.has_organ["heart"])
if(!current_species.has_organ[O_HEART])
dat += "</br><b>Does not have a circulatory system.</b>"
if(!current_species.has_organ["lungs"])
if(!current_species.has_organ[O_LUNGS])
dat += "</br><b>Does not have a respiratory system.</b>"
if(current_species.flags & NO_SCAN)
dat += "</br><b>Does not have DNA.</b>"
@@ -24,6 +24,9 @@
/datum/category_item/player_setup_item/player_global/pai/content(var/mob/user)
. += "<b>pAI:</b><br>"
if(!candidate)
log_debug("[user] pAI prefs have a null candidate var.")
return .
. += "Name: <a href='?src=\ref[src];option=name'>[candidate.name ? candidate.name : "None Set"]</a><br>"
. += "Description: <a href='?src=\ref[src];option=desc'>[candidate.description ? TextPreview(candidate.description, 40) : "None Set"]</a><br>"
. += "Role: <a href='?src=\ref[src];option=role'>[candidate.role ? TextPreview(candidate.role, 40) : "None Set"]</a><br>"
+14 -21
View File
@@ -304,36 +304,29 @@ datum/preferences
character.skills = skills
character.used_skillpoints = used_skillpoints
// Destroy/cyborgize organs
for(var/name in organ_data)
// Destroy/cyborgize organs and limbs.
for(var/name in BP_ALL)
var/status = organ_data[name]
var/obj/item/organ/external/O = character.organs_by_name[name]
if(name == "torso" && !O)
O = character.organs_by_name["chest"]
if(O)
O.status = 0
if(status == "amputated")
character.organs_by_name[O.limb_name] = null
character.organs -= O
if(O.children) // This might need to become recursive.
for(var/obj/item/organ/external/child in O.children)
character.organs_by_name[child.limb_name] = null
character.organs -= child
O.remove_rejuv()
else if(status == "cyborg")
if(rlimb_data[name])
O.robotize(rlimb_data[name])
else
O.robotize()
else
var/obj/item/organ/I = character.internal_organs_by_name[name]
if(I)
if(status == "assisted")
I.mechassist()
else if(status == "mechanical")
I.robotize()
for(var/name in list(O_HEART,O_EYES,O_BRAIN))
var/status = organ_data[name]
if(!status)
continue
var/obj/item/organ/I = character.internal_organs_by_name[name]
if(I)
if(status == "assisted")
I.mechassist()
else if(status == "mechanical")
I.robotize()
character.underwear = underwear
character.undershirt = undershirt
+1 -1
View File
@@ -93,7 +93,7 @@
var/obj/item/projectile/P = damage_source
var/reflectchance = 40 - round(damage/3)
if(!(def_zone in list("chest", "groin")))
if(!(def_zone in list(BP_TORSO, BP_GROIN)))
reflectchance /= 2
if(P.starting && prob(reflectchance))
visible_message("<span class='danger'>\The [user]'s [src.name] reflects [attack_text]!</span>")
@@ -99,7 +99,7 @@
var/sound = "heartbeat"
var/sound_strength = "cannot hear"
var/heartbeat = 0
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
var/obj/item/organ/internal/heart/heart = M.internal_organs_by_name[O_HEART]
if(heart && !(heart.status & ORGAN_ROBOT))
heartbeat = 1
if(M.stat == DEAD || (M.status_flags&FAKEDEATH))
@@ -107,7 +107,7 @@
sound = "anything"
else
switch(body_part)
if("chest")
if(BP_TORSO)
sound_strength = "hear"
sound = "no heartbeat"
if(heartbeat)
@@ -116,14 +116,14 @@
else
sound = "healthy heartbeat"
var/obj/item/organ/heart/L = M.internal_organs_by_name["lungs"]
var/obj/item/organ/internal/heart/L = M.internal_organs_by_name[O_LUNGS]
if(!L || M.losebreath)
sound += " and no respiration"
else if(M.is_lung_ruptured() || M.getOxyLoss() > 50)
sound += " and [pick("wheezing","gurgling")] sounds"
else
sound += " and healthy respiration"
if("eyes","mouth")
if(O_EYES,O_MOUTH)
sound_strength = "cannot hear"
sound = "anything"
else
+8 -1
View File
@@ -600,4 +600,11 @@
desc = "A red shirt that has had the top cut low."
icon_state = "cuttop_red"
item_state = "r_suit"
worn_state = "cuttop_red"
worn_state = "cuttop_red"
/obj/item/clothing/under/harness
name = "gear harness"
desc = "How... minimalist."
icon_state = "gear_harness"
worn_state = "gear_harness"
body_parts_covered = 0
+1 -1
View File
@@ -111,7 +111,7 @@
user.do_attack_animation(src)
M.IgniteMob()
else if(reagents.total_volume)
if(user.zone_sel.selecting == "mouth")
if(user.zone_sel.selecting == O_MOUTH)
user.do_attack_animation(src)
user.visible_message(
"<span class='danger'>\The [user] smothers [target] with [src]!</span>",
+5 -5
View File
@@ -32,8 +32,8 @@
user.visible_message("<span class='danger'>\The [user] tries to take a swab sample from \the [H], but they move away.</span>")
return
if(user.zone_sel.selecting == "mouth")
if(!H.organs_by_name["head"])
if(user.zone_sel.selecting == O_MOUTH)
if(!H.organs_by_name[BP_HEAD])
user << "<span class='warning'>They don't have a head.</span>"
return
if(!H.check_has_mouth())
@@ -43,13 +43,13 @@
dna = list(H.dna.unique_enzymes)
sample_type = "DNA"
else if(user.zone_sel.selecting == "r_hand" || user.zone_sel.selecting == "l_hand")
else if(user.zone_sel.selecting == BP_R_HAND || user.zone_sel.selecting == BP_L_HAND)
var/has_hand
var/obj/item/organ/external/O = H.organs_by_name["r_hand"]
var/obj/item/organ/external/O = H.organs_by_name[BP_R_HAND]
if(istype(O) && !O.is_stump())
has_hand = 1
else
O = H.organs_by_name["l_hand"]
O = H.organs_by_name[BP_L_HAND]
if(istype(O) && !O.is_stump())
has_hand = 1
if(!has_hand)
+2 -2
View File
@@ -91,7 +91,7 @@ I said no!
/datum/recipe/brainburger
items = list(
/obj/item/weapon/reagent_containers/food/snacks/bun,
/obj/item/organ/brain
/obj/item/organ/internal/brain
)
result = /obj/item/weapon/reagent_containers/food/snacks/brainburger
@@ -1020,5 +1020,5 @@ I said no!
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
/datum/recipe/cake/brain
items = list(/obj/item/organ/brain)
items = list(/obj/item/organ/internal/brain)
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake
+2 -2
View File
@@ -25,7 +25,7 @@
finish(mob/living/carbon/human/H)
if(!H.reagents.has_reagent("dexalin"))
for(var/organ_name in list("chest","l_arm","r_arm","r_leg","l_leg","head","groin"))
for(var/organ_name in BP_ALL)
var/obj/item/organ/external/E = H.get_organ(organ_name)
E.take_damage(0, 5, 0)
@@ -41,7 +41,7 @@
finish(mob/living/carbon/human/H)
if(!H.reagents.has_reagent("bicaridine"))
var/organ_name = pick("chest","l_arm","r_arm","r_leg","l_leg","head","groin")
var/organ_name = pick(BP_ALL)
var/obj/item/organ/external/E = H.get_organ(organ_name)
E.take_damage(20, 0, 0)
E.fracture()
+1 -1
View File
@@ -110,7 +110,7 @@
return
if(!target_limb) target_limb = pick("l_foot","r_foot","l_leg","r_leg","l_hand","r_hand","l_arm", "r_arm","head","chest","groin")
if(!target_limb) target_limb = pick(BP_ALL)
var/obj/item/organ/external/affecting = target.get_organ(target_limb)
var/damage = 0
+1 -1
View File
@@ -252,7 +252,7 @@
..()
/obj/item/weapon/book/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(user.zone_sel.selecting == "eyes")
if(user.zone_sel.selecting == O_EYES)
user.visible_message("<span class='notice'>You open up the book and show it to [M]. </span>", \
"<span class='notice'> [user] opens up a book and shows it to [M]. </span>")
M << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book")
+1 -1
View File
@@ -651,7 +651,7 @@ var/list/name_to_material
/material/resin/can_open_material_door(var/mob/living/user)
var/mob/living/carbon/M = user
if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
return 1
return 0
+6 -6
View File
@@ -104,9 +104,9 @@
if(88)
new/obj/item/xenos_claw(src)
if(89)
new/obj/item/organ/xenos/plasmavessel(src)
new/obj/item/organ/internal/xenos/plasmavessel(src)
if(90)
new/obj/item/organ/heart(src)
new/obj/item/organ/internal/heart(src)
if(91)
new/obj/item/device/soulstone(src)
if(92)
@@ -168,8 +168,8 @@
var/turf/T = get_turf(src.loc)
explosion(T, 0, 0, 1, 2)
qdel(src)
/obj/structure/closet/crate/secure/loot/emag_act(var/remaining_charges, var/mob/user)
/obj/structure/closet/crate/secure/loot/emag_act(var/remaining_charges, var/mob/user)
if (locked)
user << "<span class='notice'>The crate unlocks!</span>"
locked = 0
@@ -177,7 +177,7 @@
/obj/structure/closet/crate/secure/loot/proc/check_input(var/input)
if(length(input) != codelen)
return 0
. = 1
lastattempt.Cut()
for(var/i in 1 to codelen)
@@ -197,7 +197,7 @@
if(lastattempt.len)
var/bulls = 0
var/cows = 0
var/list/code_contents = code.Copy()
for(var/i in 1 to codelen)
if(lastattempt[i] == code[i])
+4 -1
View File
@@ -131,6 +131,9 @@
return ask_verb
return speech_verb
/datum/language/proc/can_speak_special(var/mob/speaker)
return 1
// Language handling.
/mob/proc/add_language(var/language)
@@ -155,7 +158,7 @@
// Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking)
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
return (speaking.can_speak_special(src) && (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages))
/mob/proc/get_language_prefix()
if(client && client.prefs.language_prefixes && client.prefs.language_prefixes.len)
+1 -1
View File
@@ -24,7 +24,7 @@
var/mob/living/carbon/M = other
if(!istype(M))
return 1
if(locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
if(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
return 1
return 0
+5 -4
View File
@@ -106,13 +106,14 @@
syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
space_chance = 10
/datum/language/machine/can_speak_special(var/mob/speaker)
return speaker.isSynthetic()
/datum/language/machine/get_random_name()
var/new_name
if(prob(70))
new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
else
new_name = pick(ai_names)
return new_name
return pick(ai_names)
//Syllable Lists
/*
@@ -11,4 +11,4 @@
/mob/living/carbon/alien/larva/New()
..()
add_language("Xenomorph") //Bonus language.
internal_organs |= new /obj/item/organ/xenos/hivenode(src)
internal_organs |= new /obj/item/organ/internal/xenos/hivenode(src)
+16 -17
View File
@@ -31,25 +31,24 @@
var/locked = 0
var/mob/living/carbon/brain/brainmob = null//The current occupant.
var/obj/item/organ/brain/brainobj = null //The current brain organ.
var/obj/item/organ/internal/brain/brainobj = null //The current brain organ.
var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm.
attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO
if(istype(O,/obj/item/organ/internal/brain) && !brainmob) //Time to stick a brain in it --NEO
var/obj/item/organ/brain/B = O
var/obj/item/organ/internal/brain/B = O
if(B.health <= 0)
user << "\red That brain is well and truly dead."
user << "<span class='warning'>That brain is well and truly dead.</span>"
return
else if(!B.brainmob)
user << "\red You aren't sure where this brain came from, but you're pretty sure it's a useless brain."
user << "<span class='warning'>You aren't sure where this brain came from, but you're pretty sure it's useless.</span>"
return
for(var/mob/V in viewers(src, null))
V.show_message(text("\blue [user] sticks \a [O] into \the [src]."))
user.visible_message("<span class='notice'>\The [user] sticks \a [O] into \the [src].</span>")
brainmob = O:brainmob
O:brainmob = null
brainmob = B.brainmob
B.brainmob = null
brainmob.loc = src
brainmob.container = src
brainmob.stat = 0
@@ -72,9 +71,9 @@
if((istype(O,/obj/item/weapon/card/id)||istype(O,/obj/item/device/pda)) && brainmob)
if(allowed(user))
locked = !locked
user << "\blue You [locked ? "lock" : "unlock"] the brain holder."
user << "<span class='notice'>You [locked ? "lock" : "unlock"] the brain holder.</span>"
else
user << "\red Access denied."
user << "<span class='warning'>Access denied.</span>"
return
if(brainmob)
O.attack(brainmob, user)//Oh noooeeeee
@@ -84,12 +83,12 @@
//TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data.
attack_self(mob/user as mob)
if(!brainmob)
user << "\red You upend the MMI, but there's nothing in it."
user << "<span class='warning'>You upend the MMI, but there's nothing in it.</span>"
else if(locked)
user << "\red You upend the MMI, but the brain is clamped into place."
user << "<span class='warning'>You upend the MMI, but the brain is clamped into place.</span>"
else
user << "\blue You upend the MMI, spilling the brain onto the floor."
var/obj/item/organ/brain/brain
user << "<span class='notice'>You upend the MMI, spilling the brain onto the floor.</span>"
var/obj/item/organ/internal/brain/brain
if (brainobj) //Pull brain organ out of MMI.
brainobj.loc = user.loc
brain = brainobj
@@ -158,7 +157,7 @@
brainmob << "Can't do that while incapacitated or dead."
radio.broadcasting = radio.broadcasting==1 ? 0 : 1
brainmob << "\blue Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting."
brainmob << "<span class='notice'>Radio is [radio.broadcasting==1 ? "now" : "no longer"] broadcasting.</span>"
Toggle_Listening()
set name = "Toggle Listening"
@@ -171,7 +170,7 @@
brainmob << "Can't do that while incapacitated or dead."
radio.listening = radio.listening==1 ? 0 : 1
brainmob << "\blue Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast."
brainmob << "<span class='notice'>Radio is [radio.listening==1 ? "now" : "no longer"] receiving broadcast.</span>"
/obj/item/device/mmi/emp_act(severity)
if(!brainmob)
@@ -1,9 +1,9 @@
/obj/item/organ/brain
/obj/item/organ/internal/brain
name = "brain"
health = 400 //They need to live awhile longer than other organs. Is this even used by organ code anymore?
desc = "A piece of juicy meat found in a person's head."
organ_tag = "brain"
parent_organ = "head"
parent_organ = BP_HEAD
vital = 1
icon_state = "brain2"
force = 1.0
@@ -15,89 +15,86 @@
attack_verb = list("attacked", "slapped", "whacked")
var/mob/living/carbon/brain/brainmob = null
/obj/item/organ/internal/brain/robotize()
replace_self_with(/obj/item/organ/internal/mmi_holder/posibrain)
/obj/item/organ/brain/robotize()
replace_self_with(/obj/item/organ/mmi_holder/posibrain)
/obj/item/organ/internal/brain/mechassist()
replace_self_with(/obj/item/organ/internal/mmi_holder)
/obj/item/organ/brain/mechassist()
replace_self_with(/obj/item/organ/mmi_holder)
/obj/item/organ/internal/brain/proc/replace_self_with(replace_path)
var/mob/living/carbon/human/tmp_owner = owner
qdel(src)
if(tmp_owner)
tmp_owner.internal_organs_by_name[organ_tag] = new replace_path(tmp_owner, 1)
tmp_owner = null
/obj/item/organ/brain/proc/replace_self_with(replace_path)
if(!owner)
new replace_path(src.loc)
qdel(src)
return
owner.internal_organs_by_name[organ_tag] = new replace_path(owner, 1)
owner.internal_organs -= src
while(null in owner.internal_organs_by_name)
owner.internal_organs_by_name -= null
while(null in owner.internal_organs)
owner.internal_organs -= null
/obj/item/organ/pariah_brain
/obj/item/organ/internal/pariah_brain
name = "brain remnants"
desc = "Did someone tread on this? It looks useless for cloning or cyborgification."
organ_tag = "brain"
parent_organ = "head"
parent_organ = BP_HEAD
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
vital = 1
/obj/item/organ/brain/xeno
/obj/item/organ/internal/brain/xeno
name = "thinkpan"
desc = "It looks kind of like an enormous wad of purple bubblegum."
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
/obj/item/organ/brain/New()
/obj/item/organ/internal/brain/New()
..()
health = config.default_brain_health
spawn(5)
if(brainmob && brainmob.client)
brainmob.client.screen.len = null //clear the hud
/obj/item/organ/brain/Destroy()
/obj/item/organ/internal/brain/Destroy()
if(brainmob)
qdel(brainmob)
brainmob = null
..()
/obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H)
name = "\the [H]'s [initial(src.name)]"
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
brainmob.dna = H.dna.Clone()
brainmob.timeofhostdeath = H.timeofdeath
/obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H)
if(!brainmob)
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
brainmob.dna = H.dna.Clone()
brainmob.timeofhostdeath = H.timeofdeath
if(H.mind)
H.mind.transfer_to(brainmob)
brainmob << "<span class='notice'>You feel slightly disoriented. That's normal when you're just a [initial(src.name)].</span>"
brainmob << "<span class='notice'>You feel slightly disoriented. That's normal when you're just \a [initial(src.name)].</span>"
callHook("debrain", list(brainmob))
/obj/item/organ/brain/examine(mob/user) // -- TLE
/obj/item/organ/internal/brain/examine(mob/user) // -- TLE
..(user)
if(brainmob && brainmob.client)//if thar be a brain inside... the brain.
user << "You can feel the small spark of life still left in this one."
else
user << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.."
/obj/item/organ/brain/removed(var/mob/living/user)
/obj/item/organ/internal/brain/removed(var/mob/living/user)
name = "[owner.real_name]'s brain"
if(name == initial(name))
name = "\the [owner.real_name]'s [initial(name)]"
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
if(borer)
borer.detatch() //Should remove borer if the brain is removed - RR
var/obj/item/organ/brain/B = src
var/obj/item/organ/internal/brain/B = src
if(istype(B) && istype(owner))
B.transfer_identity(owner)
..()
/obj/item/organ/brain/replaced(var/mob/living/target)
/obj/item/organ/internal/brain/replaced(var/mob/living/target)
if(target.key)
target.ghostize()
@@ -109,13 +106,13 @@
target.key = brainmob.key
..()
/obj/item/organ/brain/slime
/obj/item/organ/internal/brain/slime
name = "slime core"
desc = "A complex, organic knot of jelly and crystalline particles."
icon = 'icons/mob/slimes.dmi'
icon_state = "green slime extract"
/obj/item/organ/brain/golem
/obj/item/organ/internal/brain/golem
name = "chem"
desc = "A tightly furled roll of paper, covered with indecipherable runes."
icon = 'icons/obj/wizard.dmi'
@@ -9,6 +9,6 @@
if(istype(container, /obj/item/device/mmi))
qdel(container)//Gets rid of the MMI if there is one
if(loc)
if(istype(loc,/obj/item/organ/brain))
if(istype(loc,/obj/item/organ/internal/brain))
qdel(loc)//Gets rid of the brain item
..(null,1)
+1 -1
View File
@@ -7,7 +7,7 @@
/mob/living/carbon/proc/breathe()
//if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
if(!should_have_organ("lungs") || does_not_breathe) return
if(!should_have_organ(O_LUNGS) || does_not_breathe) return
var/datum/gas_mixture/breath = null
+1 -1
View File
@@ -56,7 +56,7 @@
var/d = rand(round(I.force / 4), I.force)
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/organ = H.get_organ("chest")
var/obj/item/organ/external/organ = H.get_organ(BP_TORSO)
if (istype(organ))
if(organ.take_damage(d, 0))
H.UpdateDamageIcon()
@@ -159,7 +159,7 @@
/mob/living/carbon/human/proc/generate_valid_hairstyles(var/check_gender = 1)
var/use_species = species.get_bodytype()
var/obj/item/organ/external/head/H = get_organ("head")
var/obj/item/organ/external/head/H = get_organ(BP_HEAD)
if(H) use_species = H.species.get_bodytype()
var/list/valid_hairstyles = new()
@@ -181,7 +181,7 @@
/mob/living/carbon/human/proc/generate_valid_facial_hairstyles()
var/use_species = species.get_bodytype()
var/obj/item/organ/external/head/H = get_organ("head")
var/obj/item/organ/external/head/H = get_organ(BP_HEAD)
if(H) use_species = H.species.get_bodytype()
var/list/valid_facial_hairstyles = new()
@@ -38,7 +38,7 @@
animate_tail_stop()
//Handle brain slugs.
var/obj/item/organ/external/head = get_organ("head")
var/obj/item/organ/external/head = get_organ(BP_HEAD)
var/mob/living/simple_animal/borer/B
for(var/I in head.implants)
@@ -19,11 +19,43 @@
if(src.stat == 2.0 && (act != "deathgasp"))
return
switch(act)
if ("airguitar")
if (!src.restrained())
message = "is strumming the air and headbanging like a safari chimp."
m_type = 1
if("ping", "beep", "buzz")
if(!isSynthetic())
src << "<span class='warning'>You are not a synthetic.</span>"
return
var/M = null
if(param)
for (var/mob/A in view(null, null))
if (param == A.name)
M = A
break
if(!M)
param = null
var/display_msg = "beeps"
var/use_sound = 'sound/machines/twobeep.ogg'
if(act == "buzz")
display_msg = "buzzes"
use_sound = 'sound/machines/buzz-sigh.ogg'
else if(act == "ping")
display_msg = "pings"
use_sound = 'sound/machines/ping.ogg'
if (param)
message = "[display_msg] at [param]."
else
message = "[display_msg]."
playsound(src.loc, use_sound, 50, 0)
m_type = 1
if ("blink")
message = "blinks."
m_type = 1
+25 -98
View File
@@ -39,19 +39,19 @@
msg += "<EM>[src.name]</EM>"
var/is_synth = isSynthetic()
if(is_synth)
var/use_gender = "a synthetic"
if(gender == MALE)
use_gender = "an android"
else if(gender == FEMALE)
use_gender = "a gynoid"
if(!(skipjumpsuit && skipface))
if(is_synth)
var/use_gender = "a synthetic"
if(gender == MALE)
use_gender = "an android"
else if(gender == FEMALE)
use_gender = "a gynoid"
msg += ", <font color='#555555'>[use_gender]!</font></b>"
msg += ", <font color='#555555'>[use_gender]!</font></b>"
else if(species.name != "Human")
msg += ", <b><font color='[species.get_flesh_colour(src)]'>\a [species.name]!</font></b>"
else if(species.name != "Human")
msg += ", <b><font color='[species.get_flesh_colour(src)]'>\a [species.name]!</font></b>"
msg += "<br>"
//uniform
@@ -64,60 +64,60 @@
tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]"
if(w_uniform.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!</span>\n"
else
msg += "[T.He] [T.is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
//head
if(head)
if(head.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [T.his] head!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [head.name] on [T.his] head!</span>\n"
else
msg += "[T.He] [T.is] wearing \icon[head] \a [head] on [T.his] head.\n"
//suit/armour
if(wear_suit)
if(wear_suit.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n"
else
msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n"
//suit/armour storage
if(s_store && !skipsuitstorage)
if(s_store.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [s_store.name] on [T.his] [wear_suit.name]!</span>\n"
else
msg += "[T.He] [T.is] carrying \icon[s_store] \a [s_store] on [T.his] [wear_suit.name].\n"
//back
if(back)
if(back.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [T.his] back.</span>\n"
msg += "<span class='warning'>[T.He] [T.has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [back] on [T.his] back.</span>\n"
else
msg += "[T.He] [T.has] \icon[back] \a [back] on [T.his] back.\n"
//left hand
if(l_hand)
if(l_hand.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [l_hand.name] in [T.his] left hand!</span>\n"
else
msg += "[T.He] [T.is] holding \icon[l_hand] \a [l_hand] in [T.his] left hand.\n"
//right hand
if(r_hand)
if(r_hand.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [r_hand.name] in [T.his] right hand!</span>\n"
else
msg += "[T.He] [T.is] holding \icon[r_hand] \a [r_hand] in [T.his] right hand.\n"
//gloves
if(gloves && !skipgloves)
if(gloves.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!</span>\n"
msg += "<span class='warning'>[T.He] [T.has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [gloves.name] on [T.his] hands!</span>\n"
else
msg += "[T.He] [T.has] \icon[gloves] \a [gloves] on [T.his] hands.\n"
else if(blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] [(hand_blood_color != "#030303") ? "blood" : "oil"]-stained hands!</span>\n"
msg += "<span class='warning'>[T.He] [T.has] [(hand_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained hands!</span>\n"
//handcuffed?
@@ -135,30 +135,30 @@
//belt
if(belt)
if(belt.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!</span>\n"
msg += "<span class='warning'>[T.He] [T.has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [belt.name] about [T.his] waist!</span>\n"
else
msg += "[T.He] [T.has] \icon[belt] \a [belt] about [T.his] waist.\n"
//shoes
if(shoes && !skipshoes)
if(shoes.blood_DNA)
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!</span>\n"
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [shoes.name] on [T.his] feet!</span>\n"
else
msg += "[T.He] [T.is] wearing \icon[shoes] \a [shoes] on [T.his] feet.\n"
else if(feet_blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] [(feet_blood_color != "#030303") ? "blood" : "oil"]-stained feet!</span>\n"
msg += "<span class='warning'>[T.He] [T.has] [(feet_blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained feet!</span>\n"
//mask
if(wear_mask && !skipmask)
if(wear_mask.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [T.his] face!</span>\n"
msg += "<span class='warning'>[T.He] [T.has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_mask.name] on [T.his] face!</span>\n"
else
msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] on [T.his] face.\n"
//eyes
if(glasses && !skipeyes)
if(glasses.blood_DNA)
msg += "<span class='warning'>[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!</span>\n"
msg += "<span class='warning'>[T.He] [T.has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [glasses] covering [T.his] eyes!</span>\n"
else
msg += "[T.He] [T.has] \icon[glasses] \a [glasses] covering [T.his] eyes.\n"
@@ -194,7 +194,7 @@
msg += "<span class='warning'>[T.He] [T.is] twitching ever so slightly.</span>\n"
//splints
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/o = get_organ(organ)
if(o && o.status & ORGAN_SPLINTED)
msg += "<span class='warning'>[T.He] [T.has] a splint on [T.his] [o.name]!</span>\n"
@@ -295,79 +295,6 @@
if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED))
wound_flavor_text["[temp.name]"] += "<span class='warning'>[T.His] [temp.name] is dented and swollen!</span><br>"
//Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
// ***********************************************************************************
// THIS NEEDS TO BE ENTIRELY REWRITTEN. Commenting out for now, BADLY NEEDS REWRITING.
// ***********************************************************************************
/*
var/display_chest = 0
var/display_shoes = 0
var/display_gloves = 0
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
msg += wound_flavor_text["head"]
else if(is_bleeding["head"])
msg += "<span class='warning'>[src] [T.has] blood running down [T.his] face!</span>\n"
if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
msg += wound_flavor_text["upper body"]
else if(is_bleeding["upper body"])
display_chest = 1
if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left arm"]
else if(is_bleeding["left arm"])
display_chest = 1
if(wound_flavor_text["left hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["left hand"]
else if(is_bleeding["left hand"])
display_gloves = 1
if(wound_flavor_text["right arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["right arm"]
else if(is_bleeding["right arm"])
display_chest = 1
if(wound_flavor_text["right hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["right hand"]
else if(is_bleeding["right hand"])
display_gloves = 1
if(wound_flavor_text["lower body"] && (is_destroyed["lower body"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["lower body"]
else if(is_bleeding["lower body"])
display_chest = 1
if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left leg"]
else if(is_bleeding["left leg"])
display_chest = 1
if(wound_flavor_text["left foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["left foot"]
else if(is_bleeding["left foot"])
display_shoes = 1
if(wound_flavor_text["right leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["right leg"]
else if(is_bleeding["right leg"])
display_chest = 1
if(wound_flavor_text["right foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["right foot"]
else if(is_bleeding["right foot"])
display_shoes = 1
if(display_chest)
msg += "<span class='danger'>[src] [T.has] blood soaking through from under [T.his] clothing!</span>\n"
if(display_shoes)
msg += "<span class='danger'>[src] [T.has] blood running from [T.his] shoes!</span>\n"
if(display_gloves)
msg += "<span class='danger'>[src] [T.has] blood running from under [T.his] gloves!</span>\n"
*/
for(var/limb in wound_flavor_text)
msg += wound_flavor_text[limb]
is_bleeding[limb] = null
+28 -40
View File
@@ -71,7 +71,7 @@
stat("Tank Pressure", internal.air_contents.return_pressure())
stat("Distribution Pressure", internal.distribute_pressure)
var/obj/item/organ/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA]
if(P)
stat(null, "Phoron Stored: [P.stored_plasma]/[P.max_plasma]")
@@ -145,26 +145,12 @@
var/weapon_message = "Explosive Blast"
for(var/obj/item/organ/external/temp in organs)
switch(temp.name)
if("head")
switch(temp.organ_tag)
if(BP_HEAD)
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message)
if("chest")
if(BP_TORSO)
update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message)
if("l_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_leg")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_leg")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_foot")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_foot")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("r_arm")
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if("l_arm")
else
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
@@ -174,7 +160,7 @@
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
L.implanted = 1
var/obj/item/organ/external/affected = M.organs_by_name["head"]
var/obj/item/organ/external/affected = M.organs_by_name[BP_HEAD]
affected.implants += L
L.part = affected
L.implanted(src)
@@ -318,7 +304,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/obj/item/organ/external/head = get_organ("head")
var/obj/item/organ/external/head = get_organ(BP_HEAD)
if(!head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
return "Unknown"
return real_name
@@ -655,7 +641,7 @@
///Returns a number between -1 to 2
/mob/living/carbon/human/eyecheck()
var/obj/item/organ/I = internal_organs_by_name["eyes"]
var/obj/item/organ/I = internal_organs_by_name[O_EYES]
if(!I || I.status & (ORGAN_CUT_AWAY|ORGAN_DESTROYED))
return 2
@@ -742,7 +728,7 @@
/mob/living/carbon/human/check_has_mouth()
// Todo, check stomach organ when implemented.
var/obj/item/organ/external/head/H = get_organ("head")
var/obj/item/organ/external/head/H = get_organ(BP_HEAD)
if(!H || !H.can_intake_reagents)
return 0
return 1
@@ -908,7 +894,7 @@
/mob/living/carbon/human/revive()
if(should_have_organ("heart"))
if(should_have_organ(O_HEART))
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
@@ -916,7 +902,7 @@
restore_all_organs() // Reapply robotics/amputated status from preferences.
if(!client || !key) //Don't boot out anyone already in the mob.
for (var/obj/item/organ/brain/H in world)
for (var/obj/item/organ/internal/brain/H in world)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -935,11 +921,11 @@
..()
/mob/living/carbon/human/proc/is_lung_ruptured()
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
return L && L.is_bruised()
/mob/living/carbon/human/proc/rupture_lung()
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
if(L && !L.is_bruised())
src.custom_pain("You feel a stabbing pain in your chest!", 1)
@@ -1028,7 +1014,7 @@
for(var/obj/item/O in organ.implants)
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
// All kinds of embedded objects cause bleeding.
if(!can_feel_pain(organ.limb_name))
if(!can_feel_pain(organ.organ_tag))
src << "<span class='warning'>You feel [O] moving inside your [organ.name].</span>"
else
var/msg = pick( \
@@ -1038,7 +1024,7 @@
src << msg
organ.take_damage(rand(1,3), 0, 0)
if(!(organ.status & ORGAN_ROBOT) && !should_have_organ("heart")) //There is no blood in protheses.
if(!(organ.status & ORGAN_ROBOT) && !should_have_organ(O_HEART)) //There is no blood in protheses.
organ.status |= ORGAN_BLEEDING
src.adjustToxLoss(rand(1,3))
@@ -1140,6 +1126,8 @@
qdel(hud_used)
hud_used = new /datum/hud(src)
full_prosthetic = null
if(species)
return 1
else
@@ -1205,7 +1193,7 @@
if(!target_zone)
if(!user)
target_zone = pick("chest","chest","chest","left leg","right leg","left arm", "right arm", "head")
target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD)
else
target_zone = user.zone_sel.selecting
@@ -1219,7 +1207,7 @@
fail_msg = "That limb is robotic."
else
switch(target_zone)
if("head")
if(BP_HEAD)
if(head && head.item_flags & THICKMATERIAL)
. = 0
else
@@ -1227,7 +1215,7 @@
. = 0
if(!. && error_msg && user)
if(!fail_msg)
fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
fail_msg = "There is no exposed flesh or thin material [target_zone == BP_HEAD ? "on their head" : "on their body"] to inject into."
user << "<span class='alert'>[fail_msg]</span>"
/mob/living/carbon/human/print_flavor_text(var/shrink = 1)
@@ -1285,15 +1273,15 @@
..()
/mob/living/carbon/human/has_brain()
if(internal_organs_by_name["brain"])
var/obj/item/organ/brain = internal_organs_by_name["brain"]
if(internal_organs_by_name[O_BRAIN])
var/obj/item/organ/brain = internal_organs_by_name[O_BRAIN]
if(brain && istype(brain))
return 1
return 0
/mob/living/carbon/human/has_eyes()
if(internal_organs_by_name["eyes"])
var/obj/item/organ/eyes = internal_organs_by_name["eyes"]
if(internal_organs_by_name[O_EYES])
var/obj/item/organ/eyes = internal_organs_by_name[O_EYES]
if(eyes && istype(eyes) && !(eyes.status & ORGAN_CUT_AWAY))
return 1
return 0
@@ -1402,10 +1390,10 @@
/mob/living/carbon/human/should_have_organ(var/organ_check)
var/obj/item/organ/external/affecting
if(organ_check in list("heart","lungs"))
affecting = organs_by_name["chest"]
else if(organ_check in list("liver","kidneys"))
affecting = organs_by_name["groin"]
if(organ_check in list(O_HEART, O_LUNGS))
affecting = organs_by_name[BP_TORSO]
else if(organ_check in list(O_LIVER, O_KIDNEYS))
affecting = organs_by_name[BP_GROIN]
if(affecting && (affecting.status & ORGAN_ROBOT))
return 0
@@ -180,7 +180,7 @@
*/
if(prob(80))
hit_zone = ran_zone(hit_zone)
if(prob(15) && hit_zone != "chest") // Missed!
if(prob(15) && hit_zone != BP_TORSO) // Missed!
if(!src.lying)
attack_message = "[H] attempted to strike [src], but missed!"
else
@@ -29,7 +29,7 @@
if(status_flags & GODMODE) return 0 //godmode
if(should_have_organ("brain"))
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.take_damage(amount)
brainloss = sponge.damage
@@ -43,7 +43,7 @@
if(status_flags & GODMODE) return 0 //godmode
if(should_have_organ("brain"))
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.damage = min(max(amount, 0),(maxHealth*2))
brainloss = sponge.damage
@@ -57,7 +57,7 @@
if(status_flags & GODMODE) return 0 //godmode
if(should_have_organ("brain"))
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
brainloss = min(sponge.damage,maxHealth*2)
else
@@ -189,19 +189,19 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/getOxyLoss()
if(!should_have_organ("lungs"))
if(!should_have_organ(O_LUNGS))
oxyloss = 0
return ..()
/mob/living/carbon/human/adjustOxyLoss(var/amount)
if(!should_have_organ("lungs"))
if(!should_have_organ(O_LUNGS))
oxyloss = 0
else
amount = amount*species.oxy_mod
..(amount)
/mob/living/carbon/human/setOxyLoss(var/amount)
if(!should_have_organ("lungs"))
if(!should_have_organ(O_LUNGS))
oxyloss = 0
else
..()
@@ -321,7 +321,7 @@ In most cases it makes more sense to use apply_damage() instead! And make sure t
This function restores the subjects blood to max.
*/
/mob/living/carbon/human/proc/restore_blood()
if(should_have_organ("heart"))
if(should_have_organ(O_HEART))
var/blood_volume = vessel.get_reagent_amount("blood")
vessel.add_reagent("blood",560.0-blood_volume)
@@ -345,9 +345,10 @@ This function restores all organs.
/mob/living/carbon/human/proc/get_organ(var/zone)
if(!zone) zone = "chest"
if (zone in list( "eyes", "mouth" ))
zone = "head"
if(!zone)
zone = BP_TORSO
else if (zone in list( O_EYES, O_MOUTH ))
zone = BP_HEAD
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
@@ -44,11 +44,11 @@ emp_act
agony_amount *= siemens_coeff
switch (def_zone)
if("head")
if(BP_HEAD)
agony_amount *= 1.50
if("l_hand", "r_hand")
if(BP_L_HAND, BP_R_HAND)
var/c_hand
if (def_zone == "l_hand")
if (def_zone == BP_L_HAND)
c_hand = l_hand
else
c_hand = r_hand
@@ -233,7 +233,7 @@ emp_act
//Apply blood
if(bloody)
switch(hit_area)
if("head")
if(BP_HEAD)
if(wear_mask)
wear_mask.add_blood(src)
update_inv_wear_mask(0)
@@ -243,7 +243,7 @@ emp_act
if(glasses && prob(33))
glasses.add_blood(src)
update_inv_glasses(0)
if("chest")
if(BP_TORSO)
bloody_body(src)
if(Iforce > 10 || Iforce >= 5 && prob(33))
@@ -285,7 +285,7 @@ emp_act
var/mob/living/L = O.thrower
zone = check_zone(L.zone_sel.selecting)
else
zone = ran_zone("chest",75) //Hits a random part of the body, geared towards the chest
zone = ran_zone(BP_TORSO,75) //Hits a random part of the body, geared towards the chest
//check if we hit
var/miss_chance = 15
@@ -82,8 +82,9 @@
var/list/flavor_texts = list()
var/gunshot_residue
var/pulling_punches // Are you trying not to hurt your opponent?
var/full_prosthetic // We are a robutt.
var/pulling_punches // Are you trying not to hurt your opponent?
var/full_prosthetic // We are a robutt.
var/robolimb_count = 0 // Number of robot limbs.
mob_bump_flag = HUMAN
mob_push_flags = ~HEAVY
@@ -26,7 +26,7 @@
tally += wear_suit.slowdown
if(istype(buckled, /obj/structure/bed/chair/wheelchair))
for(var/organ_name in list("l_hand","r_hand","l_arm","r_arm"))
for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || (E.status & ORGAN_DESTROYED))
tally += 4
@@ -38,7 +38,7 @@
if(shoes)
tally += shoes.slowdown
for(var/organ_name in list("l_foot","r_foot","l_leg","r_leg"))
for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || (E.status & ORGAN_DESTROYED))
tally += 4
@@ -1,5 +1,5 @@
/mob/living/carbon/human/proc/update_eyes()
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
if(eyes)
eyes.update_colour()
regenerate_icons()
@@ -113,7 +113,7 @@
// You should not be able to pick anything up, but stranger things have happened.
if(l_hand)
for(var/limb_tag in list("l_hand","l_arm"))
for(var/limb_tag in list(BP_L_HAND, BP_L_ARM))
var/obj/item/organ/external/E = get_organ(limb_tag)
if(!E)
visible_message("<span class='danger'>Lacking a functioning left hand, \the [src] drops \the [l_hand].</span>")
@@ -121,7 +121,7 @@
break
if(r_hand)
for(var/limb_tag in list("r_hand","r_arm"))
for(var/limb_tag in list(BP_R_HAND, BP_R_ARM))
var/obj/item/organ/external/E = get_organ(limb_tag)
if(!E)
visible_message("<span class='danger'>Lacking a functioning right hand, \the [src] drops \the [r_hand].</span>")
@@ -45,44 +45,44 @@ This saves us from having to call add_fingerprint() any time something is put in
/mob/living/carbon/human/proc/has_organ_for_slot(slot)
switch(slot)
if(slot_back)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_wear_mask)
return has_organ("head")
return has_organ(BP_HEAD)
if(slot_handcuffed)
return has_organ("l_hand") && has_organ("r_hand")
return has_organ(BP_L_HAND) && has_organ(BP_R_HAND)
if(slot_legcuffed)
return has_organ("l_leg") && has_organ("r_leg")
return has_organ(BP_L_FOOT) && has_organ(BP_R_FOOT)
if(slot_l_hand)
return has_organ("l_hand")
return has_organ(BP_L_HAND)
if(slot_r_hand)
return has_organ("r_hand")
return has_organ(BP_R_HAND)
if(slot_belt)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_wear_id)
// the only relevant check for this is the uniform check
return 1
if(slot_l_ear)
return has_organ("head")
return has_organ(BP_HEAD)
if(slot_r_ear)
return has_organ("head")
return has_organ(BP_HEAD)
if(slot_glasses)
return has_organ("head")
return has_organ(BP_HEAD)
if(slot_gloves)
return has_organ("l_hand") || has_organ("r_hand")
return has_organ(BP_L_HAND) || has_organ(BP_R_HAND)
if(slot_head)
return has_organ("head")
return has_organ(BP_HEAD)
if(slot_shoes)
return has_organ("r_foot") || has_organ("l_foot")
return has_organ(BP_L_FOOT) || has_organ(BP_R_FOOT)
if(slot_wear_suit)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_w_uniform)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_l_store)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_r_store)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_s_store)
return has_organ("chest")
return has_organ(BP_TORSO)
if(slot_in_backpack)
return 1
if(slot_tie)
+42 -39
View File
@@ -255,12 +255,7 @@
if (radiation)
// TODO.
if(isSynthetic())
radiation = 0
return
var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs
var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in internal_organs
if(rad_organ && !rad_organ.is_broken())
var/rads = radiation/25
radiation -= rads
@@ -280,34 +275,36 @@
if (radiation > 50)
damage = 1
radiation -= 1 * RADIATION_SPEED_COEFFICIENT
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT))
radiation -= 5 * RADIATION_SPEED_COEFFICIENT
src << "<span class='warning'>You feel weak.</span>"
Weaken(3)
if(!lying)
emote("collapse")
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT) && species.get_bodytype() == "Human") //apes go bald
if((h_style != "Bald" || f_style != "Shaved" ))
src << "<span class='warning'>Your hair falls out.</span>"
h_style = "Bald"
f_style = "Shaved"
update_hair()
if(!isSynthetic())
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT))
radiation -= 5 * RADIATION_SPEED_COEFFICIENT
src << "<span class='warning'>You feel weak.</span>"
Weaken(3)
if(!lying)
emote("collapse")
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT) && species.get_bodytype() == "Human") //apes go bald
if((h_style != "Bald" || f_style != "Shaved" ))
src << "<span class='warning'>Your hair falls out.</span>"
h_style = "Bald"
f_style = "Shaved"
update_hair()
if (radiation > 75)
radiation -= 1 * RADIATION_SPEED_COEFFICIENT
damage = 3
if(prob(5))
take_overall_damage(0, 5 * RADIATION_SPEED_COEFFICIENT, used_weapon = "Radiation Burns")
if(prob(1))
src << "<span class='warning'>You feel strange!</span>"
adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT)
emote("gasp")
radiation -= 1 * RADIATION_SPEED_COEFFICIENT
if(!isSynthetic())
if(prob(5))
take_overall_damage(0, 5 * RADIATION_SPEED_COEFFICIENT, used_weapon = "Radiation Burns")
if(prob(1))
src << "<span class='warning'>You feel strange!</span>"
adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT)
emote("gasp")
if(damage)
damage *= species.radiation_mod
damage *= isSynthetic() ? 0.5 : species.radiation_mod
adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT)
updatehealth()
if(organs.len)
if(!isSynthetic() && organs.len)
var/obj/item/organ/external/O = pick(organs)
if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage)
@@ -371,8 +368,8 @@
var/safe_pressure_min = 16 // Minimum safe partial pressure of breathable gas in kPa
// Lung damage increases the minimum safe pressure.
if(should_have_organ("lungs"))
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
if(should_have_organ(O_LUNGS))
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
if(isnull(L))
safe_pressure_min = INFINITY //No lungs, how are you breathing?
else if(L.is_broken())
@@ -525,24 +522,24 @@
if(breath.temperature >= species.heat_level_1)
if(breath.temperature < species.heat_level_2)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
else if(breath.temperature < species.heat_level_3)
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
else
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Heat")
fire_alert = max(fire_alert, 2)
else if(breath.temperature <= species.cold_level_1)
if(breath.temperature > species.cold_level_2)
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, BP_HEAD, used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
else if(breath.temperature > species.cold_level_3)
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, BP_HEAD, used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
else
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, BP_HEAD, used_weapon = "Excessive Cold")
fire_alert = max(fire_alert, 1)
@@ -691,13 +688,19 @@
*/
/mob/living/carbon/human/proc/stabilize_body_temperature()
if (species.passive_temp_gain) // We produce heat naturally.
// We produce heat naturally.
if (species.passive_temp_gain)
bodytemperature += species.passive_temp_gain
// Robolimbs cause overheating too.
if(robolimb_count)
bodytemperature += round(robolimb_count/2)
var/body_temperature_difference = species.body_temperature - bodytemperature
if (abs(body_temperature_difference) < 0.5)
return //fuck this precision
if (on_fire)
return //too busy for pesky convection
@@ -862,7 +865,7 @@
if(status_flags & GODMODE) return 0 //godmode
var/obj/item/organ/diona/node/light_organ = locate() in internal_organs
var/obj/item/organ/internal/diona/node/light_organ = locate() in internal_organs
if(!isSynthetic())
if(light_organ && !light_organ.is_broken())
@@ -1548,7 +1551,7 @@
/mob/living/carbon/human/proc/handle_pulse()
if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
if(!internal_organs_by_name["heart"])
if(!internal_organs_by_name[O_HEART])
return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
@@ -1582,7 +1585,7 @@
if(pulse == PULSE_NONE)
return
var/obj/item/organ/heart/H = internal_organs_by_name["heart"]
var/obj/item/organ/internal/heart/H = internal_organs_by_name[O_HEART]
if(!H || (H.status & ORGAN_ROBOT))
return
@@ -45,28 +45,28 @@
)
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
"groin" = list("path" = /obj/item/organ/external/groin),
"head" = list("path" = /obj/item/organ/external/head/vox),
"l_arm" = list("path" = /obj/item/organ/external/arm),
"r_arm" = list("path" = /obj/item/organ/external/arm/right),
"l_leg" = list("path" = /obj/item/organ/external/leg),
"r_leg" = list("path" = /obj/item/organ/external/leg/right),
"l_hand" = list("path" = /obj/item/organ/external/hand),
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/vox),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
has_organ = list(
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys,
"brain" = /obj/item/organ/brain,
"eyes" = /obj/item/organ/eyes,
"stack" = /obj/item/organ/stack/vox
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes,
"stack" = /obj/item/organ/internal/stack/vox
)
/datum/species/vox/get_random_name(var/gender)
@@ -108,12 +108,12 @@
// Pariahs have no stack.
has_organ = list(
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys,
"brain" = /obj/item/organ/pariah_brain,
"eyes" = /obj/item/organ/eyes
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/pariah_brain,
O_EYES = /obj/item/organ/internal/eyes
)
flags = IS_RESTRICTED | NO_SCAN | HAS_EYE_COLOR
@@ -58,8 +58,6 @@
// Death vars.
var/meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/human
var/gibber_type = /obj/effect/gibspawner/human
var/single_gib_type = /obj/effect/decal/cleanable/blood/gibs
var/remains_type = /obj/effect/decal/remains/xeno
var/gibbed_anim = "gibbed-h"
var/dusted_anim = "dust-h"
@@ -120,28 +118,28 @@
var/rarity_value = 1 // Relative rarity/collector value for this species.
// Determines the organs that the species spawns with and
var/list/has_organ = list( // which required-organ checks are conducted.
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys,
"brain" = /obj/item/organ/brain,
"appendix" = /obj/item/organ/appendix,
"eyes" = /obj/item/organ/eyes
O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain,
O_APPENDIX = /obj/item/organ/internal/appendix,
O_EYES = /obj/item/organ/internal/eyes
)
var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/list/has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
"groin" = list("path" = /obj/item/organ/external/groin),
"head" = list("path" = /obj/item/organ/external/head),
"l_arm" = list("path" = /obj/item/organ/external/arm),
"r_arm" = list("path" = /obj/item/organ/external/arm/right),
"l_leg" = list("path" = /obj/item/organ/external/leg),
"r_leg" = list("path" = /obj/item/organ/external/leg/right),
"l_hand" = list("path" = /obj/item/organ/external/hand),
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
// Bump vars
@@ -158,8 +156,8 @@
hud = new()
//If the species has eyes, they are the default vision organ
if(!vision_organ && has_organ["eyes"])
vision_organ = "eyes"
if(!vision_organ && has_organ[O_EYES])
vision_organ = O_EYES
unarmed_attacks = list()
for(var/u_type in unarmed_types)
@@ -186,13 +184,13 @@
return ((H && H.isSynthetic()) ? "flashing a 'system offline' glyph on their monitor" : show_ssd)
/datum/species/proc/get_blood_colour(var/mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? "#1F181F" : blood_color)
return ((H && H.isSynthetic()) ? SYNTH_BLOOD_COLOUR : blood_color)
/datum/species/proc/get_virus_immune(var/mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? 1 : virus_immune)
/datum/species/proc/get_flesh_colour(var/mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? "#575757" : flesh_color)
return ((H && H.isSynthetic()) ? SYNTH_FLESH_COLOUR : flesh_color)
/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type)
@@ -269,7 +267,10 @@
for(var/name in H.organs_by_name)
H.organs |= H.organs_by_name[name]
for(var/obj/item/organ/external/O in H.organs)
for(var/name in H.internal_organs_by_name)
H.internal_organs |= H.internal_organs_by_name[name]
for(var/obj/item/organ/O in (H.organs|H.internal_organs))
O.owner = H
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
@@ -33,7 +33,7 @@
return 0
switch(zone)
if("head", "mouth", "eyes")
if(BP_HEAD, O_MOUTH, O_EYES)
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
@@ -18,7 +18,7 @@
flesh_color = "#137E8F"
has_organ = list(
"brain" = /obj/item/organ/brain/golem
"brain" = /obj/item/organ/internal/brain/golem
)
death_message = "becomes completely motionless..."
@@ -38,12 +38,12 @@
toxins_mod = 1.1
has_organ = list(
"heart" = /obj/item/organ/heart,
"lungs" = /obj/item/organ/lungs,
"liver" = /obj/item/organ/liver,
"kidneys" = /obj/item/organ/kidneys,
"brain" = /obj/item/organ/brain,
"eyes" = /obj/item/organ/eyes
O_HEART = /obj/item/organ/heart,
O_LUNGS = /obj/item/organ/lungs,
O_LIVER = /obj/item/organ/liver,
O_KIDNEYS = /obj/item/organ/kidneys,
O_BRAIN = /obj/item/organ/brain,
O_EYES = /obj/item/organ/eyes
)
/*
@@ -39,17 +39,17 @@
pass_flags = PASSTABLE
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
"groin" = list("path" = /obj/item/organ/external/groin),
"head" = list("path" = /obj/item/organ/external/head/no_eyes),
"l_arm" = list("path" = /obj/item/organ/external/arm),
"r_arm" = list("path" = /obj/item/organ/external/arm/right),
"l_leg" = list("path" = /obj/item/organ/external/leg),
"r_leg" = list("path" = /obj/item/organ/external/leg/right),
"l_hand" = list("path" = /obj/item/organ/external/hand),
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
@@ -20,7 +20,7 @@
death_message = "rapidly loses cohesion, splattering across the ground..."
has_organ = list(
"brain" = /obj/item/organ/brain/slime
"brain" = /obj/item/organ/internal/brain/slime
)
breath_type = null
@@ -31,17 +31,17 @@
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/unbreakable),
"groin" = list("path" = /obj/item/organ/external/groin/unbreakable),
"head" = list("path" = /obj/item/organ/external/head/unbreakable),
"l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable),
"r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable),
"l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable),
"r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable),
"l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable),
"r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable),
"l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable)
BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable),
BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable),
BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable),
BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable),
BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable),
BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable)
)
/datum/species/slime/handle_death(var/mob/living/carbon/human/H)
@@ -152,17 +152,17 @@
reagent_tag = IS_SKRELL
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
"groin" = list("path" = /obj/item/organ/external/groin),
"head" = list("path" = /obj/item/organ/external/head/skrell),
"l_arm" = list("path" = /obj/item/organ/external/arm),
"r_arm" = list("path" = /obj/item/organ/external/arm/right),
"l_leg" = list("path" = /obj/item/organ/external/leg),
"r_leg" = list("path" = /obj/item/organ/external/leg/right),
"l_hand" = list("path" = /obj/item/organ/external/hand),
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/skrell),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
/datum/species/diona
@@ -190,26 +190,26 @@
water and other radiation."
has_organ = list(
"nutrient channel" = /obj/item/organ/diona/nutrients,
"neural strata" = /obj/item/organ/diona/strata,
"response node" = /obj/item/organ/diona/node,
"gas bladder" = /obj/item/organ/diona/bladder,
"polyp segment" = /obj/item/organ/diona/polyp,
"anchoring ligament" = /obj/item/organ/diona/ligament
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients,
O_STRATA = /obj/item/organ/internal/diona/strata,
O_RESPONSE = /obj/item/organ/internal/diona/node,
O_GBLADDER = /obj/item/organ/internal/diona/bladder,
O_POLYP = /obj/item/organ/internal/diona/polyp,
O_ANCHOR = /obj/item/organ/internal/diona/ligament
)
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/diona/chest),
"groin" = list("path" = /obj/item/organ/external/diona/groin),
"head" = list("path" = /obj/item/organ/external/head/no_eyes/diona),
"l_arm" = list("path" = /obj/item/organ/external/diona/arm),
"r_arm" = list("path" = /obj/item/organ/external/diona/arm/right),
"l_leg" = list("path" = /obj/item/organ/external/diona/leg),
"r_leg" = list("path" = /obj/item/organ/external/diona/leg/right),
"l_hand" = list("path" = /obj/item/organ/external/diona/hand),
"r_hand" = list("path" = /obj/item/organ/external/diona/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/diona/foot),
"r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
BP_TORSO = list("path" = /obj/item/organ/external/diona/chest),
BP_GROIN = list("path" = /obj/item/organ/external/diona/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes/diona),
BP_L_ARM = list("path" = /obj/item/organ/external/diona/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/diona/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/diona/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/diona/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/diona/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/diona/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/diona/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/diona/foot/right)
)
inherent_verbs = list(
@@ -260,9 +260,13 @@
if(H.mind)
H.mind.transfer_to(S)
if(H.isSynthetic())
H.visible_message("<span class='danger'>\The [H] collapses into parts, revealing a solitary diona nymph at the core.</span>")
return
for(var/mob/living/carbon/alien/diona/D in H.contents)
if(D.client)
D.loc = H.loc
D.forceMove(get_turf(H))
else
qdel(D)
@@ -108,7 +108,7 @@ Des: Removes all infection images from aliens and places an infection image on a
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
@@ -130,7 +130,7 @@ Des: Checks if the passed mob (C) is infected with the alien egg, then gives eac
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
@@ -149,7 +149,7 @@ Des: Removes the alien infection image from all aliens in the world located in p
for(var/mob/living/carbon/alien in player_list)
if(!locate(/obj/item/organ/xenos/hivenode) in alien.internal_organs)
if(!locate(/obj/item/organ/internal/xenos/hivenode) in alien.internal_organs)
continue
if(alien.client)
@@ -110,7 +110,7 @@ var/const/MAX_ACTIVE_TIME = 400
return
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs)
return
@@ -221,7 +221,7 @@ var/const/MAX_ACTIVE_TIME = 400
return 0
var/mob/living/carbon/C = M
if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
if(istype(C) && locate(/obj/item/organ/internal/xenos/hivenode) in C.internal_organs)
return 0
if(ishuman(C))
@@ -11,7 +11,7 @@
/mob/living/carbon/human/proc/gain_plasma(var/amount)
var/obj/item/organ/xenos/plasmavessel/I = internal_organs_by_name["plasma vessel"]
var/obj/item/organ/internal/xenos/plasmavessel/I = internal_organs_by_name[O_PLASMA]
if(!istype(I)) return
if(amount)
@@ -20,13 +20,13 @@
/mob/living/carbon/human/proc/check_alien_ability(var/cost,var/needs_foundation,var/needs_organ)
var/obj/item/organ/xenos/plasmavessel/P = internal_organs_by_name["plasma vessel"]
var/obj/item/organ/internal/xenos/plasmavessel/P = internal_organs_by_name[O_PLASMA]
if(!istype(P))
src << "<span class='danger'>Your plasma vessel has been removed!</span>"
return
if(needs_organ)
var/obj/item/organ/I = internal_organs_by_name[needs_organ]
var/obj/item/organ/internal/I = internal_organs_by_name[needs_organ]
if(!I)
src << "<span class='danger'>Your [needs_organ] has been removed!</span>"
return
@@ -62,7 +62,7 @@
src << "<span class='alium'>You need to be closer.</span>"
return
var/obj/item/organ/xenos/plasmavessel/I = M.internal_organs_by_name["plasma vessel"]
var/obj/item/organ/internal/xenos/plasmavessel/I = M.internal_organs_by_name[O_PLASMA]
if(!istype(I))
src << "<span class='alium'>Their plasma vessel is missing.</span>"
return
@@ -70,7 +70,7 @@
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
if (amount)
amount = abs(round(amount))
if(check_alien_ability(amount,0,"plasma vessel"))
if(check_alien_ability(amount,0,O_PLASMA))
M.gain_plasma(amount)
M << "<span class='alium'>[src] has transfered [amount] plasma to you.</span>"
src << "<span class='alium'>You have transferred [amount] plasma to [M].</span>"
@@ -92,7 +92,7 @@
src << "There's already an egg here."
return
if(check_alien_ability(75,1,"egg sac"))
if(check_alien_ability(75,1,O_EGG))
visible_message("<span class='alium'><B>[src] has laid an egg!</B></span>")
new /obj/effect/alien/egg(loc)
@@ -119,7 +119,7 @@
set desc = "Plants some alien weeds"
set category = "Abilities"
if(check_alien_ability(50,1,"resin spinner"))
if(check_alien_ability(50,1,O_RESIN))
visible_message("<span class='alium'><B>[src] has planted some alien weeds!</B></span>")
new /obj/effect/alien/weeds/node(loc)
return
@@ -153,7 +153,7 @@
src << "<span class='alium'>You cannot dissolve this object.</span>"
return
if(check_alien_ability(200,0,"acid gland"))
if(check_alien_ability(200,0,O_ACID))
new /obj/effect/alien/acid(get_turf(O), O)
visible_message("<span class='alium'><B>[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!</B></span>")
@@ -164,7 +164,7 @@
set desc = "Spits neurotoxin at someone, paralyzing them for a short time if they are not wearing protective gear."
set category = "Abilities"
if(!check_alien_ability(50,0,"acid gland"))
if(!check_alien_ability(50,0,O_ACID))
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
@@ -206,7 +206,7 @@
if(!choice)
return
if(!check_alien_ability(75,1,"resin spinner"))
if(!check_alien_ability(75,1,O_RESIN))
return
visible_message("<span class='warning'><B>[src] vomits up a thick purple substance and begins to shape it!</B></span>", "<span class='alium'>You shape a [choice].</span>")
@@ -44,11 +44,11 @@
vision_flags = SEE_SELF|SEE_MOBS
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel,
"hive node" = /obj/item/organ/xenos/hivenode,
"nutrient vessel" = /obj/item/organ/diona/nutrients
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
bump_flag = ALIEN
@@ -61,17 +61,17 @@
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest),
"groin" = list("path" = /obj/item/organ/external/groin),
"head" = list("path" = /obj/item/organ/external/head/no_eyes),
"l_arm" = list("path" = /obj/item/organ/external/arm),
"r_arm" = list("path" = /obj/item/organ/external/arm/right),
"l_leg" = list("path" = /obj/item/organ/external/leg),
"r_leg" = list("path" = /obj/item/organ/external/leg/right),
"l_hand" = list("path" = /obj/item/organ/external/hand),
"r_hand" = list("path" = /obj/item/organ/external/hand/right),
"l_foot" = list("path" = /obj/item/organ/external/foot),
"r_foot" = list("path" = /obj/item/organ/external/foot/right)
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/no_eyes),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
/datum/species/xenos/get_bodytype()
@@ -112,7 +112,7 @@
if(environment.gas["phoron"] > 0 || locate(/obj/effect/alien/weeds) in T)
if(!regenerate(H))
var/obj/item/organ/xenos/plasmavessel/P = H.internal_organs_by_name["plasma vessel"]
var/obj/item/organ/internal/xenos/plasmavessel/P = H.internal_organs_by_name[O_PLASMA]
P.stored_plasma += weeds_plasma_rate
P.stored_plasma = min(max(P.stored_plasma,0),P.max_plasma)
..()
@@ -172,13 +172,13 @@
deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/queen,
"acid gland" = /obj/item/organ/xenos/acidgland,
"hive node" = /obj/item/organ/xenos/hivenode,
"resin spinner" = /obj/item/organ/xenos/resinspinner,
"nutrient vessel" = /obj/item/organ/diona/nutrients
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/queen,
O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
@@ -211,11 +211,11 @@
deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/hunter,
"hive node" = /obj/item/organ/xenos/hivenode,
"nutrient vessel" = /obj/item/organ/diona/nutrients
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/hunter,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
@@ -239,12 +239,12 @@
deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/sentinel,
"acid gland" = /obj/item/organ/xenos/acidgland,
"hive node" = /obj/item/organ/xenos/hivenode,
"nutrient vessel" = /obj/item/organ/diona/nutrients
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/sentinel,
O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
@@ -271,14 +271,14 @@
deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi'
has_organ = list(
"heart" = /obj/item/organ/heart,
"brain" = /obj/item/organ/brain/xeno,
"egg sac" = /obj/item/organ/xenos/eggsac,
"plasma vessel" = /obj/item/organ/xenos/plasmavessel/queen,
"acid gland" = /obj/item/organ/xenos/acidgland,
"hive node" = /obj/item/organ/xenos/hivenode,
"resin spinner" = /obj/item/organ/xenos/resinspinner,
"nutrient vessel" = /obj/item/organ/diona/nutrients
O_HEART = /obj/item/organ/internal/heart,
O_BRAIN = /obj/item/organ/internal/brain/xeno,
O_EGG = /obj/item/organ/internal/xenos/eggsac,
O_PLASMA = /obj/item/organ/internal/xenos/plasmavessel/queen,
O_ACID = /obj/item/organ/internal/xenos/acidgland,
O_HIVE = /obj/item/organ/internal/xenos/hivenode,
O_RESIN = /obj/item/organ/internal/xenos/resinspinner,
O_NUTRIENT = /obj/item/organ/internal/diona/nutrients
)
inherent_verbs = list(
@@ -121,7 +121,7 @@
if(can_reach_splints)
var/removed_splint
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
var/obj/item/organ/external/o = get_organ(organ)
if (o && o.status & ORGAN_SPLINTED)
var/obj/item/W = new /obj/item/stack/medical/splint(get_turf(src), 1)
@@ -47,22 +47,22 @@ var/global/list/sparring_attack_cache = list()
if(attack_damage >= 5 && armour < 2 && !(target == user) && stun_chance <= attack_damage * 5) // 25% standard chance
switch(zone) // strong punches can have effects depending on where they hit
if("head", "mouth", "eyes")
if(BP_HEAD, O_EYES, O_MOUTH)
// Induce blurriness
target.visible_message("<span class='danger'>[target] looks momentarily disoriented.</span>", "<span class='danger'>You see stars.</span>")
target.apply_effect(attack_damage*2, EYE_BLUR, armour)
if("l_arm", "l_hand")
if(BP_L_ARM, BP_L_HAND)
if (target.l_hand)
// Disarm left hand
//Urist McAssistant dropped the macguffin with a scream just sounds odd.
target.visible_message("<span class='danger'>\The [target.l_hand] was knocked right out of [target]'s grasp!</span>")
target.drop_l_hand()
if("r_arm", "r_hand")
if(BP_R_ARM, BP_R_HAND)
if (target.r_hand)
// Disarm right hand
target.visible_message("<span class='danger'>\The [target.r_hand] was knocked right out of [target]'s grasp!</span>")
target.drop_r_hand()
if("chest")
if(BP_TORSO)
if(!target.lying)
var/turf/T = get_step(get_turf(target), get_dir(get_turf(user), get_turf(target)))
if(!T.density)
@@ -73,7 +73,7 @@ var/global/list/sparring_attack_cache = list()
if(prob(50))
target.set_dir(reverse_dir[target.dir])
target.apply_effect(attack_damage * 0.4, WEAKEN, armour)
if("groin")
if(BP_GROIN)
target.visible_message("<span class='warning'>[target] looks like \he is in pain!</span>", "<span class='warning'>[(target.gender=="female") ? "Oh god that hurt!" : "Oh no, not your[pick("testicles", "crown jewels", "clockweights", "family jewels", "marbles", "bean bags", "teabags", "sweetmeats", "goolies")]!"]</span>")
target.apply_effects(stutter = attack_damage * 2, agony = attack_damage* 3, blocked = armour)
if("l_leg", "l_foot", "r_leg", "r_foot")
@@ -93,7 +93,7 @@ var/global/list/sparring_attack_cache = list()
playsound(user.loc, attack_sound, 25, 1, -1)
/datum/unarmed_attack/proc/handle_eye_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target)
var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = target.internal_organs_by_name[O_EYES]
if(eyes)
eyes.take_damage(rand(3,4), 1)
user.visible_message("<span class='danger'>[user] presses \his [eye_attack_text] into [target]'s [eyes.name]!</span>")
@@ -114,7 +114,7 @@ var/global/list/sparring_attack_cache = list()
if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
return 0
if (user == target && (zone == "head" || zone == "eyes" || zone == "mouth"))
if (user == target && (zone == BP_HEAD || zone == O_EYES || zone == O_MOUTH))
return 0
return 1
@@ -137,7 +137,7 @@ var/global/list/sparring_attack_cache = list()
if(!target.lying)
switch(zone)
if("head", "mouth", "eyes")
if(BP_HEAD, O_MOUTH, O_EYES)
// ----- HEAD ----- //
switch(attack_damage)
if(1 to 2)
@@ -177,7 +177,7 @@ var/global/list/sparring_attack_cache = list()
if (user.legcuffed)
return 0
if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", "groin")))
if(!(zone in list("l_leg", "r_leg", "l_foot", "r_foot", BP_GROIN)))
return 0
var/obj/item/organ/external/E = user.organs_by_name["l_foot"]
@@ -208,12 +208,13 @@ var/global/list/damage_icon_parts = list()
if(!(O.status & ORGAN_DESTROYED))
O.update_icon()
if(O.damage_state == "00") continue
var/use_colour = ((O.status & ORGAN_ROBOT) ? SYNTH_BLOOD_COLOUR : O.species.get_blood_colour(src))
var/icon/DI
var/cache_index = "[O.damage_state]/[O.icon_name]/[O.species.get_blood_colour()]/[species.get_bodytype()]"
var/cache_index = "[O.damage_state]/[O.icon_name]/[use_colour]/[species.get_bodytype()]"
if(damage_icon_parts[cache_index] == null)
DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
DI.Blend(O.species.get_blood_colour(), ICON_MULTIPLY)
DI.Blend(use_colour, ICON_MULTIPLY)
damage_icon_parts[cache_index] = DI
else
DI = damage_icon_parts[cache_index]
@@ -252,7 +253,7 @@ var/global/list/damage_icon_parts = list()
icon_key += "[lip_style]"
else
icon_key += "nolips"
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES]
if(eyes)
icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
else
@@ -286,7 +287,7 @@ var/global/list/damage_icon_parts = list()
base_icon = human_icon_cache[icon_key]
else
//BEGIN CACHED ICON GENERATION.
var/obj/item/organ/external/chest = get_organ("chest")
var/obj/item/organ/external/chest = get_organ(BP_TORSO)
base_icon = chest.get_icon()
for(var/obj/item/organ/external/part in organs)
@@ -351,7 +352,7 @@ var/global/list/damage_icon_parts = list()
//Reset our hair
overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD)
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
if(update_icons) update_icons()
return
@@ -763,9 +764,10 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.blood_DNA)
var/obj/item/clothing/suit/S = wear_suit
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
if(istype(S)) //You can put non-suits in your suit slot (diona nymphs etc).
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
overlays_standing[SUIT_LAYER] = standing
update_tail_showing(0)
@@ -33,15 +33,9 @@
else
loc_temp = environment.temperature
if(loc_temp < 310.15) // a cold place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
else // a hot place
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
//Account for massive pressure differences
bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1)
if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc
if(bodytemperature <= (T0C - 50)) // hurt temperature
if(bodytemperature <= 50) // sqrting negative numbers is bad
adjustToxLoss(200)
+2 -2
View File
@@ -344,8 +344,8 @@ default behaviour is:
/mob/living/proc/get_organ_target()
var/mob/shooter = src
var/t = shooter:zone_sel.selecting
if ((t in list( "eyes", "mouth" )))
t = "head"
if ((t in list( O_EYES, O_MOUTH )))
t = BP_HEAD
var/obj/item/organ/external/def_zone = ran_zone(t)
return def_zone
+1 -1
View File
@@ -404,7 +404,7 @@
var/total_damage = 0
for(var/i in 1 to 3)
var/damage = min(W.force*1.5, 20)*damage_mod
apply_damage(damage, W.damtype, "head", 0, sharp=W.sharp, edge=W.edge)
apply_damage(damage, W.damtype, BP_HEAD, 0, sharp=W.sharp, edge=W.edge)
total_damage += damage
var/oxyloss = total_damage
@@ -65,10 +65,12 @@
user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]&deg;C ([M.bodytemperature*1.8-459.67]&deg;F)", 1)
if("prosthetics")
var/mob/living/carbon/human/H = M
user << "<span class='notice'>Analyzing Results for \the [H]:</span>"
if(H.isSynthetic())
user << "System instability: <font color='green'>[H.getToxLoss()]</font>"
user << "Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>"
user << "<span class='notice'>External prosthetics:</span>"
var/organ_found
if(H.internal_organs.len)
@@ -64,7 +64,7 @@
/obj/item/robot_parts,
/obj/item/borg/upgrade,
/obj/item/device/flash, //to build borgs
/obj/item/organ/brain, //to insert into MMIs.
/obj/item/organ/internal/brain, //to insert into MMIs.
/obj/item/stack/cable_coil, //again, for borg building
/obj/item/weapon/circuitboard,
/obj/item/slime_extract,
@@ -106,7 +106,7 @@
if(istype(host,/mob/living/carbon/human))
var/mob/living/carbon/human/H = host
var/obj/item/organ/external/head = H.get_organ("head")
var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
head.implants -= src
controlling = 0
@@ -73,7 +73,7 @@
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/E = H.organs_by_name["head"]
var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD]
if(!E || (E.status & ORGAN_DESTROYED))
src << "\The [H] does not have a head!"
@@ -118,7 +118,7 @@
replace_brain()
else
// If they're in normally, implant removal can get them out.
var/obj/item/organ/external/head = H.get_organ("head")
var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
head.implants += src
return
@@ -181,11 +181,11 @@
H.ChangeToHusk()
var/obj/item/organ/borer/B = new(H)
var/obj/item/organ/internal/borer/B = new(H)
H.internal_organs_by_name["brain"] = B
H.internal_organs |= B
var/obj/item/organ/external/affecting = H.get_organ("head")
var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD)
affecting.implants -= src
var/s2h_id = src.computer_id
@@ -133,7 +133,7 @@
if(ishuman(target_mob))
var/mob/living/carbon/human/H = target_mob
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG)
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), sharp=1, edge=1)
return H
@@ -53,7 +53,7 @@
var/parrot_state = PARROT_WANDER //Hunt for a perch when created
var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick.
var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down
var/parrot_dam_zone = list("chest", "head", "l_arm", "l_leg", "r_arm", "r_leg") //For humans, select a bodypart to attack
var/parrot_dam_zone = list(BP_TORSO, BP_HEAD, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG) //For humans, select a bodypart to attack
var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower.
var/parrot_been_shot = 0 //Parrots get a speed bonus after being shot. This will deincrement every Life() and at 0 the parrot will return to regular speed.
+3
View File
@@ -1128,3 +1128,6 @@ mob/proc/yank_out_object()
src.in_throw_mode = 1
if(src.throw_icon)
src.throw_icon.icon_state = "act_throw_on"
/mob/proc/isSynthetic()
return 0
+16 -16
View File
@@ -124,7 +124,7 @@
if(iscarbon(affecting))
handle_eye_mouth_covering(affecting, assailant, assailant.zone_sel.selecting)
if(force_down)
if(affecting.loc != assailant.loc)
force_down = 0
@@ -148,14 +148,14 @@
/obj/item/weapon/grab/proc/handle_eye_mouth_covering(mob/living/carbon/target, mob/user, var/target_zone)
var/announce = (target_zone != last_hit_zone) //only display messages when switching between different target zones
last_hit_zone = target_zone
switch(target_zone)
if("mouth")
if(O_MOUTH)
if(announce)
user.visible_message("<span class='warning'>\The [user] covers [target]'s mouth!</span>")
if(target.silent < 3)
target.silent = 3
if("eyes")
if(O_EYES)
if(announce)
assailant.visible_message("<span class='warning'>[assailant] covers [affecting]'s eyes!</span>")
if(affecting.eye_blind < 3)
@@ -232,7 +232,7 @@
else
assailant.visible_message("<span class='warning'>[assailant] pins [affecting] down to the ground (now hands)!</span>")
apply_pinning(affecting, assailant)
state = GRAB_AGGRESSIVE
icon_state = "grabbed1"
hud.icon_state = "reinforce1"
@@ -252,7 +252,7 @@
hud.name = "kill"
affecting.Stun(10) //10 ticks of ensured grab
else if(state < GRAB_UPGRADING)
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
hud.icon_state = "kill1"
state = GRAB_KILL
@@ -264,7 +264,7 @@
affecting.setClickCooldown(10)
affecting.losebreath += 1
affecting.set_dir(WEST)
adjust_position()
adjust_position()
//This is used to make sure the victim hasn't managed to yackety sax away before using the grab.
/obj/item/weapon/grab/proc/confirm()
@@ -284,10 +284,10 @@
return
if(world.time < (last_action + 20))
return
last_action = world.time
reset_kill_state() //using special grab moves will interrupt choking them
//clicking on the victim while grabbing them
if(M == affecting)
if(ishuman(affecting))
@@ -300,21 +300,21 @@
force_down = 0
return
inspect_organ(affecting, assailant, hit_zone)
if(I_GRAB)
jointlock(affecting, assailant, hit_zone)
if(I_HURT)
if(hit_zone == "eyes")
if(hit_zone == O_EYES)
attack_eye(affecting, assailant)
else if(hit_zone == "head")
else if(hit_zone == BP_HEAD)
headbut(affecting, assailant)
else
dislocate(affecting, assailant, hit_zone)
if(I_DISARM)
pin_down(affecting, assailant)
//clicking on yourself while grabbing them
if(M == assailant && state >= GRAB_AGGRESSIVE)
devour(affecting, assailant)
@@ -325,7 +325,7 @@
qdel(src)
/obj/item/weapon/grab/proc/reset_kill_state()
if(state == GRAB_KILL)
if(state == GRAB_KILL)
assailant.visible_message("<span class='warning'>[assailant] lost \his tight grip on [affecting]'s neck!</span>")
hud.icon_state = "kill"
state = GRAB_NECK
+5 -5
View File
@@ -60,7 +60,7 @@
if(!istype(attacker))
return
var/datum/unarmed_attack/attack = attacker.get_unarmed_attack(target, "eyes")
var/datum/unarmed_attack/attack = attacker.get_unarmed_attack(target, O_EYES)
if(!attack)
return
@@ -93,11 +93,11 @@
if(istype(hat))
damage += hat.force * 3
var/armor = target.run_armor_check("head", "melee")
target.apply_damage(damage, BRUTE, "head", armor)
attacker.apply_damage(10, BRUTE, "head", attacker.run_armor_check("head", "melee"))
var/armor = target.run_armor_check(BP_HEAD, "melee")
target.apply_damage(damage, BRUTE, BP_HEAD, armor)
attacker.apply_damage(10, BRUTE, BP_HEAD, attacker.run_armor_check(BP_HEAD, "melee"))
if(!armor && target.headcheck("head") && prob(damage))
if(!armor && target.headcheck(BP_HEAD) && prob(damage))
target.apply_effect(20, PARALYZE)
target.visible_message("<span class='danger'>[target] [target.species.get_knockout_message(target)]</span>")
+59 -57
View File
@@ -11,15 +11,16 @@
return L.mob_size <= MOB_SMALL
return 0
/mob/living/proc/isSynthetic()
return 0
// If they are 100% robotic, they count as synthetic.
/mob/living/carbon/human/isSynthetic()
// If they are 100% robotic, they count as synthetic.
for(var/obj/item/organ/external/E in organs)
if(!(E.status & ORGAN_ROBOT))
return 0
return 1
if(isnull(full_prosthetic))
robolimb_count = 0
for(var/obj/item/organ/external/E in organs)
if(E.status & ORGAN_ROBOT)
robolimb_count++
if(robolimb_count == organs.len)
full_prosthetic = 1
return full_prosthetic
/mob/living/silicon/isSynthetic()
return 1
@@ -72,46 +73,13 @@ proc/getsensorlevel(A)
Miss Chance
*/
//TODO: Integrate defence zones and targeting body parts with the actual organ system, move these into organ definitions.
//The base miss chance for the different defence zones
var/list/global/base_miss_chance = list(
"head" = 40,
"chest" = 10,
"groin" = 20,
"l_leg" = 20,
"r_leg" = 20,
"l_arm" = 20,
"r_arm" = 20,
"l_hand" = 50,
"r_hand" = 50,
"l_foot" = 50,
"r_foot" = 50,
)
//Used to weight organs when an organ is hit randomly (i.e. not a directed, aimed attack).
//Also used to weight the protection value that armour provides for covering that body part when calculating protection from full-body effects.
var/list/global/organ_rel_size = list(
"head" = 25,
"chest" = 70,
"groin" = 30,
"l_leg" = 25,
"r_leg" = 25,
"l_arm" = 25,
"r_arm" = 25,
"l_hand" = 10,
"r_hand" = 10,
"l_foot" = 10,
"r_foot" = 10,
)
/proc/check_zone(zone)
if(!zone) return "chest"
if(!zone) return BP_TORSO
switch(zone)
if("eyes")
zone = "head"
if("mouth")
zone = "head"
if(O_EYES)
zone = BP_HEAD
if(O_MOUTH)
zone = BP_HEAD
return zone
// Returns zone with a certain probability. If the probability fails, or no zone is specified, then a random body part is chosen.
@@ -126,17 +94,17 @@ var/list/global/organ_rel_size = list(
var/ran_zone = zone
while (ran_zone == zone)
ran_zone = pick (
organ_rel_size["head"]; "head",
organ_rel_size["chest"]; "chest",
organ_rel_size["groin"]; "groin",
organ_rel_size["l_arm"]; "l_arm",
organ_rel_size["r_arm"]; "r_arm",
organ_rel_size["l_leg"]; "l_leg",
organ_rel_size["r_leg"]; "r_leg",
organ_rel_size["l_hand"]; "l_hand",
organ_rel_size["r_hand"]; "r_hand",
organ_rel_size["l_foot"]; "l_foot",
organ_rel_size["r_foot"]; "r_foot",
organ_rel_size[BP_HEAD]; BP_HEAD,
organ_rel_size[BP_TORSO]; BP_TORSO,
organ_rel_size[BP_GROIN]; BP_GROIN,
organ_rel_size[BP_L_ARM]; BP_L_ARM,
organ_rel_size[BP_R_ARM]; BP_R_ARM,
organ_rel_size[BP_L_LEG]; BP_L_LEG,
organ_rel_size[BP_R_LEG]; BP_R_LEG,
organ_rel_size[BP_L_HAND]; BP_L_HAND,
organ_rel_size[BP_R_HAND]; BP_R_HAND,
organ_rel_size[BP_L_FOOT]; BP_L_FOOT,
organ_rel_size[BP_R_FOOT]; BP_R_FOOT,
)
return ran_zone
@@ -564,3 +532,37 @@ proc/is_blind(A)
return threatcount
#undef SAFE_PERP
//TODO: Integrate defence zones and targeting body parts with the actual organ system, move these into organ definitions.
//The base miss chance for the different defence zones
var/list/global/base_miss_chance = list(
"head" = 40,
"chest" = 10,
"groin" = 20,
"l_leg" = 20,
"r_leg" = 20,
"l_arm" = 20,
"r_arm" = 20,
"l_hand" = 50,
"r_hand" = 50,
"l_foot" = 50,
"r_foot" = 50,
)
//Used to weight organs when an organ is hit randomly (i.e. not a directed, aimed attack).
//Also used to weight the protection value that armour provides for covering that body part when calculating protection from full-body effects.
var/list/global/organ_rel_size = list(
"head" = 25,
"chest" = 70,
"groin" = 30,
"l_leg" = 25,
"r_leg" = 25,
"l_arm" = 25,
"r_arm" = 25,
"l_hand" = 10,
"r_hand" = 10,
"l_foot" = 10,
"r_foot" = 10,
)
@@ -5,7 +5,7 @@ datum/preferences
s_tone = random_skin_tone()
var/use_head_species
var/obj/item/organ/external/head/temp_head = H.get_organ("head")
var/obj/item/organ/external/head/temp_head = H.get_organ(BP_HEAD)
if(temp_head)
use_head_species = temp_head.species.get_bodytype()
else
@@ -202,20 +202,20 @@ datum/preferences
icobase = 'icons/mob/human_races/r_human.dmi'
preview_icon = new /icon(icobase, "")
for(var/name in list("torso", "groin", "head", "r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
for(var/name in BP_ALL)
if(organ_data[name] == "amputated")
continue
if(organ_data[name] == "cyborg")
var/datum/robolimb/R
if(rlimb_data[name]) R = all_robolimbs[rlimb_data[name]]
if(!R) R = basic_robolimb
if(name in list("torso", "groin", "head"))
if(name in list(BP_TORSO, BP_GROIN, BP_HEAD))
preview_icon.Blend(icon(R.icon, "[name]_[g]"), ICON_OVERLAY)
else
preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY)
continue
var/icon/limb_icon
if(name in list("torso", "groin", "head"))
if(name in list(BP_TORSO, BP_GROIN, BP_HEAD))
limb_icon = new /icon(icobase, "[name]_[g]")
else
limb_icon = new /icon(icobase, "[name]")
@@ -244,7 +244,7 @@ datum/preferences
// This is absolute garbage but whatever. It will do until this entire file can be rewritten without crashes.
var/use_eye_icon = "eyes_s"
var/list/use_eye_data = current_species.has_limbs["head"]
var/list/use_eye_data = current_species.has_limbs[BP_HEAD]
if(islist(use_eye_data))
var/use_eye_path = use_eye_data["path"]
var/obj/item/organ/external/head/temp_head = new use_eye_path ()
+6 -6
View File
@@ -68,12 +68,12 @@
if (istype(mover, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mover
var/damage = 5
H.apply_damage(rand(0, damage), BRUTE, "head")
H.apply_damage(rand(0, damage), BRUTE, "chest")
H.apply_damage(rand(0, damage), BRUTE, "l_leg")
H.apply_damage(rand(0, damage), BRUTE, "r_leg")
H.apply_damage(rand(0, damage), BRUTE, "l_arm")
H.apply_damage(rand(0, damage), BRUTE, "r_arm")
H.apply_damage(rand(0, damage), BRUTE, BP_HEAD)
H.apply_damage(rand(0, damage), BRUTE, BP_TORSO)
H.apply_damage(rand(0, damage), BRUTE, BP_L_LEG)
H.apply_damage(rand(0, damage), BRUTE, BP_R_LEG)
H.apply_damage(rand(0, damage), BRUTE, BP_L_ARM)
H.apply_damage(rand(0, damage), BRUTE, BP_R_ARM)
H.weakened = max(H.weakened,2)
H.updatehealth()
+7 -7
View File
@@ -19,7 +19,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
vessel = new/datum/reagents(600)
vessel.my_atom = src
if(!should_have_organ("heart")) //We want the var for safety but we can do without the actual blood.
if(!should_have_organ(O_HEART)) //We want the var for safety but we can do without the actual blood.
return
vessel.add_reagent("blood",560)
@@ -39,7 +39,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(in_stasis)
return
if(!should_have_organ("heart"))
if(!should_have_organ(O_HEART))
return
if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
@@ -62,8 +62,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
// Damaged heart virtually reduces the blood volume, as the blood isn't
// being pumped properly anymore.
if(species && should_have_organ("heart"))
var/obj/item/organ/heart/heart = internal_organs_by_name["heart"]
if(species && should_have_organ(O_HEART))
var/obj/item/organ/internal/heart/heart = internal_organs_by_name[O_HEART]
if(!heart)
blood_volume = 0
@@ -137,7 +137,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Makes a blood drop, leaking amt units of blood from the mob
/mob/living/carbon/human/proc/drip(var/amt as num)
if(!should_have_organ("heart")) //TODO: Make drips come from the reagents instead.
if(!should_have_organ(O_HEART)) //TODO: Make drips come from the reagents instead.
return
if(!amt)
@@ -188,7 +188,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//For humans, blood does not appear from blue, it comes from vessels.
/mob/living/carbon/human/take_blood(obj/item/weapon/reagent_containers/container, var/amount)
if(!should_have_organ("heart"))
if(!should_have_organ(O_HEART))
return null
if(vessel.get_reagent_amount("blood") < amount)
@@ -216,7 +216,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from reagents to vessel, respecting blood types compatability.
/mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount)
if(should_have_organ("heart"))
if(should_have_organ(O_HEART))
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return
+15 -15
View File
@@ -1,5 +1,14 @@
//CORTICAL BORER ORGANS.
/obj/item/organ/borer/process()
/obj/item/organ/internal/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
organ_tag = "brain"
desc = "A disgusting space slug."
parent_organ = BP_HEAD
vital = 1
/obj/item/organ/internal/borer/process()
// Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
@@ -21,16 +30,7 @@
goo.basecolor = "#412464"
goo.update_icon()
/obj/item/organ/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
organ_tag = "brain"
desc = "A disgusting space slug."
parent_organ = "head"
vital = 1
/obj/item/organ/borer/removed(var/mob/living/user)
/obj/item/organ/internal/borer/removed(var/mob/living/user)
..()
@@ -43,19 +43,19 @@
qdel(src)
//VOX ORGANS.
/obj/item/organ/stack
/obj/item/organ/internal/stack
name = "cortical stack"
parent_organ = "head"
parent_organ = BP_HEAD
icon_state = "brain-prosthetic"
organ_tag = "stack"
vital = 1
var/backup_time = 0
var/datum/mind/backup
/obj/item/organ/stack/process()
/obj/item/organ/internal/stack/process()
if(owner && owner.stat != DEAD && !is_broken())
backup_time = world.time
if(owner.mind) backup = owner.mind
/obj/item/organ/stack/vox/stack
/obj/item/organ/internal/stack/vox/stack
name = "vox cortical stack"
+28 -57
View File
@@ -6,47 +6,37 @@ var/list/organ_cache = list()
germ_level = 0
// Strings.
var/organ_tag = "organ"
var/parent_organ = "chest"
// Appearance.
var/dead_icon
var/organ_tag = "organ" // Unique identifier.
var/parent_organ = BP_TORSO // Organ holding this object.
// Status tracking.
var/status = 0
var/vital //Lose a vital limb, die immediately.
var/damage = 0 // amount of damage to the organ
var/status = 0 // Various status flags (such as robotic)
var/vital // Lose a vital limb, die immediately.
var/damage = 0 // Current damage to the organ
// Reference data.
var/mob/living/carbon/human/owner = null
var/list/transplant_data
var/list/datum/autopsy_data/autopsy_data = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
var/datum/dna/dna
var/datum/species/species
var/mob/living/carbon/human/owner // Current mob owning the organ.
var/list/transplant_data // Transplant match data.
var/list/autopsy_data = list() // Trauma data for forensics.
var/list/trace_chemicals = list() // Traces of chemicals in the organ.
var/datum/dna/dna // Original DNA.
var/datum/species/species // Original species.
// Damage vars.
var/min_bruised_damage = 10
var/min_broken_damage = 30
var/max_damage
var/rejecting // Is this organ already being rejected?
var/min_bruised_damage = 10 // Damage before considered bruised
var/min_broken_damage = 30 // Damage before becoming broken
var/max_damage // Damage cap
var/rejecting // Is this organ already being rejected?
/obj/item/organ/Destroy()
if(!owner)
return ..()
if(istype(owner, /mob/living/carbon))
if((owner.internal_organs) && (src in owner.internal_organs))
owner.internal_organs -= src
if(istype(owner, /mob/living/carbon/human))
if((owner.internal_organs_by_name) && (src in owner.internal_organs_by_name))
owner.internal_organs_by_name -= src
if((owner.organs) && (src in owner.organs))
owner.organs -= src
if((owner.organs_by_name) && (src in owner.organs_by_name))
owner.organs_by_name -= src
if(src in owner.contents)
owner.contents -= src
owner = null
if(owner) owner = null
if(transplant_data) transplant_data.Cut()
if(autopsy_data) autopsy_data.Cut()
if(trace_chemicals) trace_chemicals.Cut()
dna = null
species = null
return ..()
/obj/item/organ/proc/update_health()
@@ -92,8 +82,6 @@ var/list/organ_cache = list()
damage = max_damage
status |= ORGAN_DEAD
processing_objects -= src
if(dead_icon)
icon_state = dead_icon
if(owner && vital)
owner.death()
@@ -115,7 +103,7 @@ var/list/organ_cache = list()
germ_level = 0
return
if(!owner)
if(!owner && reagents)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
@@ -193,6 +181,9 @@ var/list/organ_cache = list()
/obj/item/organ/proc/receive_chem(chemical as obj)
return 0
/obj/item/organ/proc/remove_rejuv()
qdel(src)
/obj/item/organ/proc/rejuvenate(var/ignore_prosthetic_prefs)
damage = 0
status = 0
@@ -203,16 +194,6 @@ var/list/organ_cache = list()
else if(status == "mechanical")
robotize()
/obj/item/organ/proc/remove_rejuv()
if(owner)
owner.internal_organs -= src
owner.internal_organs_by_name[organ_tag] = null
while(null in owner.internal_organs)
owner.internal_organs -= null
while(null in owner.internal_organs_by_name)
owner.internal_organs_by_name -= null
qdel(src)
/obj/item/organ/proc/is_damaged()
return damage > 0
@@ -336,16 +317,6 @@ var/list/organ_cache = list()
affected.internal_organs |= src
target.internal_organs_by_name[organ_tag] = src
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
// Apply our eye colour to the target.
if(istype(target) && eye_colour)
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
target.update_eyes()
..()
/obj/item/organ/proc/bitten(mob/user)
if(status & ORGAN_ROBOT)
@@ -374,7 +345,7 @@ var/list/organ_cache = list()
/obj/item/organ/attack_self(mob/user as mob)
// Convert it to an edible form, yum yum.
if((status & ORGAN_ROBOT) && user.a_intent == "help" && user.zone_sel.selecting == "mouth")
if((status & ORGAN_ROBOT) && user.a_intent == I_HELP && user.zone_sel.selecting == O_MOUTH)
bitten(user)
return
+107 -87
View File
@@ -15,50 +15,51 @@
organ_tag = "limb"
// Strings
var/limb_name
var/broken_description // fracture string if any.
var/damage_state = "00" // Modifier used for generating the on-mob damage overlay for this limb.
// Damage vars.
var/brute_mod = 1 // Multiplier for incoming brute damage.
var/burn_mod = 1 // As above for burn.
var/damage_state = "00" // Modifier used for generating the on-mob damage overlay for this limb.
var/brute_dam = 0 // Actual current brute damage.
var/burn_dam = 0 // Actual current burn damage.
var/last_dam = -1
var/brute_mod = 1 // Multiplier for incoming brute damage.
var/burn_mod = 1 // As above for burn.
var/brute_dam = 0 // Actual current brute damage.
var/burn_dam = 0 // Actual current burn damage.
var/last_dam = -1 // used in healing/processing calculations.
// Appearance vars.
var/icon_name = null
var/body_part = null
var/icon_position = 0
var/model
var/force_icon
var/icon/mob_icon
var/gendered_icon = 0
var/s_tone
var/list/s_col
var/list/h_col
var/body_hair
var/icon_name = null // Icon state base.
var/body_part = null // Part flag
var/icon_position = 0 // Used in mob overlay layering calculations.
var/model // Used when caching robolimb icons.
var/force_icon // Used to force override of species-specific limb icons (for prosthetics).
var/icon/mob_icon // Cached icon for use in mob overlays.
var/gendered_icon = 0 // Whether or not the icon state appends a gender.
var/s_tone // Skin tone.
var/list/s_col // skin colour
var/list/h_col // hair colour
var/body_hair // Icon blend for body hair if any.
// Wound and structural data.
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
var/list/wounds = list()
var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len!
var/obj/item/organ/external/parent
var/list/obj/item/organ/external/children
var/list/internal_organs = list() // Internal organs of this body part
var/broken_description
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/list/implants = list()
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
var/list/wounds = list() // wound datum list.
var/number_wounds = 0 // number of wounds, which is NOT wounds.len!
var/obj/item/organ/external/parent // Master-limb.
var/list/children // Sub-limbs.
var/list/internal_organs = list() // Internal organs of this body part
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/list/implants = list() // Currently implanted objects.
var/organ_rel_size = 25 // Relative size of the organ.
var/base_miss_chance = 20 // Chance of missing.
// Joint/state stuff.
var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand
var/disfigured = 0
var/cannot_amputate
var/cannot_break
var/joint = "joint" // Descriptive string used in dislocation.
var/amputation_point // Descriptive string used in amputation.
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
var/encased // Needs to be opened with a saw to access the organs.
var/can_grasp // It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand // Modifies stance tally/ability to stand.
var/disfigured = 0 // Scarred/burned beyond recognition.
var/cannot_amputate // Impossible to amputate.
var/cannot_break // Impossible to fracture.
var/joint = "joint" // Descriptive string used in dislocation.
var/amputation_point // Descriptive string used in amputation.
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
var/encased // Needs to be opened with a saw to access the organs.
// Surgery vars.
var/open = 0
@@ -67,6 +68,7 @@
/obj/item/organ/external/Destroy()
if(parent && parent.children)
parent.children -= src
@@ -78,6 +80,13 @@
for(var/obj/item/organ/O in internal_organs)
qdel(O)
if(owner)
owner.organs -= src
owner.organs_by_name[organ_tag] = null
owner.organs_by_name -= organ_tag
while(null in owner.organs)
owner.organs -= null
return ..()
/obj/item/organ/external/attack_self(var/mob/user)
@@ -183,7 +192,7 @@
/obj/item/organ/external/replaced(var/mob/living/carbon/human/target)
owner = target
if(istype(owner))
owner.organs_by_name[limb_name] = src
owner.organs_by_name[organ_tag] = src
owner.organs |= src
for(var/obj/item/organ/organ in src)
organ.loc = owner
@@ -319,11 +328,6 @@
if(internal)
status &= ~ORGAN_BROKEN
/*if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS))
var/obj/item/organ/external/stump/S = locate() in children
if(S)
world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb."*/
//Sync the organ's damage with its wounds
src.update_damages()
owner.updatehealth()
@@ -356,11 +360,11 @@ This function completely restores a damaged organ to perfect condition.
if(owner && !ignore_prosthetic_prefs)
if(owner.client && owner.client.prefs && owner.client.prefs.real_name == owner.real_name)
var/status = owner.client.prefs.organ_data[limb_name]
var/status = owner.client.prefs.organ_data[organ_tag]
if(status == "amputated")
remove_rejuv()
else if(status == "cyborg")
var/robodata = owner.client.prefs.rlimb_data[limb_name]
var/robodata = owner.client.prefs.rlimb_data[organ_tag]
if(robodata)
robotize(robodata)
else
@@ -370,20 +374,16 @@ This function completely restores a damaged organ to perfect condition.
/obj/item/organ/external/remove_rejuv()
if(owner)
owner.organs -= src
owner.organs_by_name[limb_name] = null
while(null in owner.organs)
owner.organs -= null
while(null in owner.organs_by_name)
owner.organs_by_name -= null
owner.organs_by_name[organ_tag] = null
owner.organs_by_name -= organ_tag
while(null in owner.organs) owner.organs -= null
if(children && children.len)
for(var/obj/item/organ/external/E in children)
E.remove_rejuv()
children.Cut()
for(var/obj/item/organ/O in contents)
O.remove_rejuv()
qdel(src)
for(var/obj/item/organ/internal/I in internal_organs)
I.remove_rejuv()
..()
/obj/item/organ/external/proc/createwound(var/type = CUT, var/damage)
if(damage == 0) return
@@ -652,7 +652,7 @@ Note that amputating the affected organ does in fact remove the infection from t
else if(W.damage_type == BURN)
burn_dam += W.damage
if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ("heart")))
if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ(O_HEART)))
W.bleed_timer--
status |= ORGAN_BLEEDING
@@ -661,7 +661,7 @@ Note that amputating the affected organ does in fact remove the infection from t
number_wounds += W.amount
//things tend to bleed if they are CUT OPEN
if (open && !clamped && (H && H.should_have_organ("heart")))
if (open && !clamped && (H && H.should_have_organ(O_HEART)))
status |= ORGAN_BLEEDING
//Bone fractures
@@ -789,7 +789,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(status & ORGAN_ROBOT)
gore = new /obj/effect/decal/cleanable/blood/gibs/robot(get_turf(victim))
else
gore = new victim.species.single_gib_type(get_turf(victim))
gore = new /obj/effect/decal/cleanable/blood/gibs(get_turf(victim))
if(species)
if(species.get_flesh_colour())
gore.fleshcolor = species.get_flesh_colour()
@@ -905,7 +905,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(isnull(suit.supporting_limbs))
return
owner << "You feel \the [suit] constrict about your [name], supporting it."
owner << "<span class='notice'>You feel \the [suit] constrict about your [name], supporting it.</span>"
status |= ORGAN_SPLINTED
suit.supporting_limbs |= src
return
@@ -919,14 +919,20 @@ Note that amputating the affected organ does in fact remove the infection from t
status &= ~ORGAN_BROKEN
return 1
/obj/item/organ/external/robotize(var/company, var/ski)
/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
if(status & ORGAN_ROBOT)
return
if(status & ORGAN_ROBOT)
return
..()
brute_mod = 0.8
burn_mod = 0.8
brute_mod = 0.8 // More resistant to brute.
burn_mod = 0.8 // More resistant to burn.
max_damage = initial(max_damage)*0.65 // Significantly easier to remove with trauma.
brute_mod = 0.8
burn_mod = 0.8
@@ -949,23 +955,25 @@ Note that amputating the affected organ does in fact remove the infection from t
for(var/obj/item/organ/external/T in children)
T.robotize(company, 1)
if(owner)
if(!skip_prosthetics)
owner.full_prosthetic = null // Will be rechecked next isSynthetic() call.
for(var/obj/item/organ/thing in src.contents)
if(istype(thing))
if(thing.vital)
continue
owner.internal_organs_by_name[thing.organ_tag] = null
owner.internal_organs.Remove(thing)
qdel(thing)
if(!keep_organs)
for(var/obj/item/organ/thing in internal_organs)
if(istype(thing))
if(thing.vital)
continue
internal_organs -= thing
owner.internal_organs_by_name[thing.organ_tag] = null
owner.internal_organs_by_name -= thing.organ_tag
owner.internal_organs.Remove(thing)
qdel(thing)
while(null in owner.internal_organs)
owner.internal_organs -= null
while(null in owner.internal_organs_by_name)
owner.internal_organs -= null
return 1
@@ -1047,7 +1055,7 @@ Note that amputating the affected organ does in fact remove the infection from t
release_restraints(victim)
victim.organs -= src
victim.organs_by_name[limb_name] = null // Remove from owner's vars.
victim.organs_by_name[organ_tag] = null // Remove from owner's vars.
//Robotic limbs explode if sabotaged.
if(is_robotic && sabotaged)
@@ -1140,7 +1148,7 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/chest
name = "upper body"
limb_name = "chest"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 100
min_broken_damage = 35
@@ -1154,43 +1162,46 @@ Note that amputating the affected organ does in fact remove the infection from t
cannot_amputate = 1
parent_organ = null
encased = "ribcage"
organ_rel_size = 70
base_miss_chance = 10
/obj/item/organ/external/chest/robotize()
if(..())
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/cell(owner,1)
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
/obj/item/organ/external/groin
name = "lower body"
limb_name = "groin"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 35
w_class = 5
body_part = LOWER_TORSO
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
amputation_point = "lumbar"
joint = "hip"
dislocated = -1
gendered_icon = 1
organ_rel_size = 30
/obj/item/organ/external/arm
limb_name = "l_arm"
organ_tag = "l_arm"
name = "left arm"
icon_name = "l_arm"
max_damage = 50
min_broken_damage = 30
w_class = 3
body_part = ARM_LEFT
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "left elbow"
amputation_point = "left shoulder"
can_grasp = 1
/obj/item/organ/external/arm/right
limb_name = "r_arm"
organ_tag = "r_arm"
name = "right arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
@@ -1198,7 +1209,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right shoulder"
/obj/item/organ/external/leg
limb_name = "l_leg"
organ_tag = "l_leg"
name = "left leg"
icon_name = "l_leg"
max_damage = 50
@@ -1206,13 +1217,13 @@ Note that amputating the affected organ does in fact remove the infection from t
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
parent_organ = BP_GROIN
joint = "left knee"
amputation_point = "left hip"
can_stand = 1
/obj/item/organ/external/leg/right
limb_name = "r_leg"
organ_tag = "r_leg"
name = "right leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
@@ -1221,7 +1232,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right hip"
/obj/item/organ/external/foot
limb_name = "l_foot"
organ_tag = "l_foot"
name = "left foot"
icon_name = "l_foot"
min_broken_damage = 15
@@ -1232,13 +1243,15 @@ Note that amputating the affected organ does in fact remove the infection from t
joint = "left ankle"
amputation_point = "left ankle"
can_stand = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/foot/removed()
if(owner) owner.u_equip(owner.shoes)
..()
/obj/item/organ/external/foot/right
limb_name = "r_foot"
organ_tag = "r_foot"
name = "right foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
@@ -1248,7 +1261,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right ankle"
/obj/item/organ/external/hand
limb_name = "l_hand"
organ_tag = "l_hand"
name = "left hand"
icon_name = "l_hand"
min_broken_damage = 15
@@ -1258,13 +1271,15 @@ Note that amputating the affected organ does in fact remove the infection from t
joint = "left wrist"
amputation_point = "left wrist"
can_grasp = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/hand/removed()
owner.u_equip(owner.gloves)
..()
/obj/item/organ/external/hand/right
limb_name = "r_hand"
organ_tag = "r_hand"
name = "right hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
@@ -1273,7 +1288,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right wrist"
/obj/item/organ/external/head
limb_name = "head"
organ_tag = BP_HEAD
icon_name = "head"
name = "head"
max_damage = 75
@@ -1281,14 +1296,19 @@ Note that amputating the affected organ does in fact remove the infection from t
w_class = 3
body_part = HEAD
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "jaw"
amputation_point = "neck"
gendered_icon = 1
encased = "skull"
base_miss_chance = 40
var/eye_icon = "eyes_s"
// These organs are important for robotizing at chargen.
/obj/item/organ/external/head/robotize(var/company, var/skip_prosthetics, var/keep_organs)
return ..(company, skip_prosthetics, 1)
/obj/item/organ/external/head/removed()
if(owner)
name = "[owner.real_name]'s head"
+3 -3
View File
@@ -40,7 +40,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
..()
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/removed()
@@ -53,8 +53,8 @@ var/global/list/limb_icon_cache = list()
overlays.Cut()
if(!owner || !owner.species)
return
if(owner.should_have_organ("eyes"))
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(owner.should_have_organ(O_EYES))
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eye_icon)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', eye_icon)
if(eyes)
+70 -25
View File
@@ -3,24 +3,52 @@
/****************************************************
INTERNAL ORGANS DEFINES
****************************************************/
/obj/item/organ/internal
var/dead_icon // Icon to use when the organ has died.
/obj/item/organ/internal/die()
..()
if((status & ORGAN_DEAD) && dead_icon)
icon_state = dead_icon
/obj/item/organ/internal/Destroy()
if(owner)
owner.internal_organs.Remove(src)
owner.internal_organs_by_name[organ_tag] = null
owner.internal_organs_by_name -= organ_tag
while(null in owner.internal_organs)
owner.internal_organs -= null
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
if(istype(E)) E.internal_organs -= src
return ..()
/obj/item/organ/internal/remove_rejuv()
if(owner)
owner.internal_organs -= src
owner.internal_organs_by_name[organ_tag] = null
owner.internal_organs_by_name -= organ_tag
while(null in owner.internal_organs)
owner.internal_organs -= null
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
if(istype(E)) E.internal_organs -= src
..()
// Brain is defined in brain_item.dm.
/obj/item/organ/heart
/obj/item/organ/internal/heart
name = "heart"
icon_state = "heart-on"
organ_tag = "heart"
parent_organ = "chest"
organ_tag = O_HEART
parent_organ = BP_TORSO
dead_icon = "heart-off"
/obj/item/organ/lungs
/obj/item/organ/internal/lungs
name = "lungs"
icon_state = "lungs"
gender = PLURAL
organ_tag = "lungs"
parent_organ = "chest"
organ_tag = O_LUNGS
parent_organ = BP_TORSO
/obj/item/organ/lungs/process()
/obj/item/organ/internal/lungs/process()
..()
if(!owner)
@@ -38,14 +66,14 @@
spawn owner.emote("me", 1, "gasps for air!")
owner.losebreath += 15
/obj/item/organ/kidneys
/obj/item/organ/internal/kidneys
name = "kidneys"
icon_state = "kidneys"
gender = PLURAL
organ_tag = "kidneys"
parent_organ = "groin"
organ_tag = O_KIDNEYS
parent_organ = BP_GROIN
/obj/item/organ/kidneys/process()
/obj/item/organ/internal/kidneys/process()
..()
@@ -62,22 +90,39 @@
else if(is_broken())
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
/obj/item/organ/eyes
/obj/item/organ/internal/eyes
name = "eyeballs"
icon_state = "eyes"
gender = PLURAL
organ_tag = "eyes"
parent_organ = "head"
organ_tag = O_EYES
parent_organ = BP_HEAD
var/list/eye_colour = list(0,0,0)
/obj/item/organ/eyes/robotize()
/obj/item/organ/internal/eyes/robotize()
..()
name = "optical sensor"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
dead_icon = "camera_broken"
/obj/item/organ/eyes/proc/update_colour()
/obj/item/organ/internal/eyes/robot
name = "optical sensor"
/obj/item/organ/internal/eyes/robot/New()
..()
robotize()
/obj/item/organ/internal/eyes/replaced(var/mob/living/carbon/human/target)
// Apply our eye colour to the target.
if(istype(target) && eye_colour)
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
target.update_eyes()
..()
/obj/item/organ/internal/eyes/proc/update_colour()
if(!owner)
return
eye_colour = list(
@@ -86,13 +131,13 @@
owner.b_eyes ? owner.b_eyes : 0
)
/obj/item/organ/eyes/take_damage(amount, var/silent=0)
/obj/item/organ/internal/eyes/take_damage(amount, var/silent=0)
var/oldbroken = is_broken()
..()
if(is_broken() && !oldbroken && owner && !owner.stat)
owner << "<span class='danger'>You go blind!</span>"
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
/obj/item/organ/internal/eyes/process() //Eye damage replaces the old eye_stat var.
..()
if(!owner)
return
@@ -101,13 +146,13 @@
if(is_broken())
owner.eye_blind = 20
/obj/item/organ/liver
/obj/item/organ/internal/liver
name = "liver"
icon_state = "liver"
organ_tag = "liver"
parent_organ = "groin"
parent_organ = BP_GROIN
/obj/item/organ/liver/process()
/obj/item/organ/internal/liver/process()
..()
@@ -130,7 +175,7 @@
src.damage += 0.2 * PROCESS_ACCURACY
//Damaged one shares the fun
else
var/obj/item/organ/O = pick(owner.internal_organs)
var/obj/item/organ/internal/O = pick(owner.internal_organs)
if(O)
O.damage += 0.2 * PROCESS_ACCURACY
@@ -155,13 +200,13 @@
else
take_damage(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY, prob(1)) // Chance to warn them
/obj/item/organ/appendix
/obj/item/organ/internal/appendix
name = "appendix"
icon_state = "appendix"
parent_organ = "groin"
parent_organ = BP_GROIN
organ_tag = "appendix"
/obj/item/organ/appendix/removed()
/obj/item/organ/internal/appendix/removed()
if(owner)
var/inflamed = 0
for(var/datum/disease/appendicitis/appendicitis in owner.viruses)
+1 -1
View File
@@ -5,7 +5,7 @@
/obj/item/organ/external/stump/New(var/mob/living/carbon/holder, var/internal, var/obj/item/organ/external/limb)
if(istype(limb))
limb_name = limb.limb_name
organ_tag = limb.organ_tag
body_part = limb.body_part
amputation_point = limb.amputation_point
joint = limb.joint
+8 -8
View File
@@ -1,6 +1,6 @@
var/global/list/all_robolimbs = list()
var/global/list/chargen_robolimbs = list()
var/global/datum/robolimb/basic_robolimb
var/list/all_robolimbs = list()
var/list/chargen_robolimbs = list()
var/datum/robolimb/basic_robolimb
/proc/populate_robolimb_list()
basic_robolimb = new()
@@ -18,26 +18,26 @@ var/global/datum/robolimb/basic_robolimb
var/list/species_cannot_use = list()
/datum/robolimb/bishop
company = "Bishop Cybernetics"
company = "Bishop"
desc = "This limb has a white polymer casing with blue holo-displays."
icon = 'icons/mob/human_races/cyberlimbs/bishop.dmi'
/datum/robolimb/hesphaistos
company = "Hesphiastos Industries"
company = "Hesphiastos"
desc = "This limb has a militaristic black and green casing with gold stripes."
icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi'
/datum/robolimb/zenghu
company = "Zeng-Hu Pharmaceuticals"
company = "Zeng-Hu"
desc = "This limb has a rubbery fleshtone covering with visible seams."
icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi'
/datum/robolimb/xion
company = "Xion Manufacturing Group"
company = "Xion"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion.dmi'
/datum/robolimb/ipc
company = "Morpheus Cyberkinetics"
company = "Morpheus"
desc = "This limb is simple and functional; no effort has been made to make it look human."
icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
+56 -50
View File
@@ -26,7 +26,7 @@
/obj/item/organ/external/diona/chest
name = "core trunk"
limb_name = "chest"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 200
min_broken_damage = 50
@@ -35,56 +35,58 @@
vital = 1
cannot_amputate = 1
parent_organ = null
gendered_icon = 1
/obj/item/organ/external/diona/groin
name = "fork"
limb_name = "groin"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 50
w_class = 4
body_part = LOWER_TORSO
parent_organ = "chest"
parent_organ = BP_TORSO
gendered_icon = 1
/obj/item/organ/external/diona/arm
name = "left upper tendril"
limb_name = "l_arm"
organ_tag = "l_arm"
icon_name = "l_arm"
max_damage = 35
min_broken_damage = 20
w_class = 3
body_part = ARM_LEFT
parent_organ = "chest"
parent_organ = BP_TORSO
can_grasp = 1
/obj/item/organ/external/diona/arm/right
name = "right upper tendril"
limb_name = "r_arm"
organ_tag = "r_arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
/obj/item/organ/external/diona/leg
name = "left lower tendril"
limb_name = "l_leg"
organ_tag = "l_leg"
icon_name = "l_leg"
max_damage = 35
min_broken_damage = 20
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
parent_organ = BP_GROIN
can_stand = 1
/obj/item/organ/external/diona/leg/right
name = "right lower tendril"
limb_name = "r_leg"
organ_tag = "r_leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
icon_position = RIGHT
/obj/item/organ/external/diona/foot
name = "left foot"
limb_name = "l_foot"
organ_tag = "l_foot"
icon_name = "l_foot"
max_damage = 20
min_broken_damage = 10
@@ -96,7 +98,7 @@
/obj/item/organ/external/diona/foot/right
name = "right foot"
limb_name = "r_foot"
organ_tag = "r_foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
icon_position = RIGHT
@@ -106,7 +108,7 @@
/obj/item/organ/external/diona/hand
name = "left grasper"
limb_name = "l_hand"
organ_tag = "l_hand"
icon_name = "l_hand"
max_damage = 30
min_broken_damage = 15
@@ -117,13 +119,15 @@
/obj/item/organ/external/diona/hand/right
name = "right grasper"
limb_name = "r_hand"
organ_tag = "r_hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
parent_organ = "r_arm"
//DIONA ORGANS.
/obj/item/organ/external/diona/removed()
if(status & ORGAN_ROBOT)
return ..()
var/mob/living/carbon/human/H = owner
..()
if(!istype(H) || !H.organs || !H.organs.len)
@@ -131,63 +135,65 @@
if(prob(50) && spawn_diona_nymph(get_turf(src)))
qdel(src)
/obj/item/organ/diona/process()
return
/obj/item/organ/diona/strata
name = "neural strata"
parent_organ = "chest"
/obj/item/organ/diona/bladder
name = "gas bladder"
parent_organ = "head"
/obj/item/organ/diona/polyp
name = "polyp segment"
parent_organ = "groin"
/obj/item/organ/diona/ligament
name = "anchoring ligament"
parent_organ = "groin"
/obj/item/organ/diona/node
name = "receptor node"
parent_organ = "head"
/obj/item/organ/diona/nutrients
name = "nutrient vessel"
parent_organ = "chest"
/obj/item/organ/diona
/obj/item/organ/internal/diona
name = "diona nymph"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
/obj/item/organ/diona/removed(var/mob/living/user)
/obj/item/organ/internal/diona/removed(var/mob/living/user, var/skip_nymph)
if(status & ORGAN_ROBOT)
return ..()
var/mob/living/carbon/human/H = owner
..()
if(!istype(H) || !H.organs || !H.organs.len)
H.death()
if(prob(50) && spawn_diona_nymph(get_turf(src)))
if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src)))
qdel(src)
/obj/item/organ/internal/diona/process()
return
/obj/item/organ/internal/diona/strata
name = "neural strata"
parent_organ = BP_TORSO
/obj/item/organ/internal/diona/bladder
name = "gas bladder"
parent_organ = BP_HEAD
/obj/item/organ/internal/diona/polyp
name = "polyp segment"
parent_organ = BP_GROIN
/obj/item/organ/internal/diona/ligament
name = "anchoring ligament"
parent_organ = BP_GROIN
/obj/item/organ/internal/diona/node
name = "receptor node"
parent_organ = BP_HEAD
/obj/item/organ/internal/diona/nutrients
name = O_NUTRIENT
parent_organ = BP_TORSO
// These are different to the standard diona organs as they have a purpose in other
// species (absorbing radiation and light respectively)
/obj/item/organ/diona/nutrients
name = "nutrient vessel"
organ_tag = "nutrient vessel"
/obj/item/organ/internal/diona/nutrients
name = O_NUTRIENT
organ_tag = O_NUTRIENT
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
/obj/item/organ/diona/nutrients/removed()
return
/obj/item/organ/internal/diona/nutrients/removed(var/mob/user)
return ..(user, 1)
/obj/item/organ/diona/node
/obj/item/organ/internal/diona/node
name = "receptor node"
organ_tag = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
/obj/item/organ/diona/node/removed()
/obj/item/organ/internal/diona/node/removed()
return
+36 -40
View File
@@ -1,17 +1,17 @@
/obj/item/organ/cell
/obj/item/organ/internal/cell
name = "microbattery"
desc = "A small, powerful cell for use in fully prosthetic bodies."
icon = 'icons/obj/power.dmi'
icon_state = "scell"
organ_tag = "cell"
parent_organ = "chest"
parent_organ = BP_TORSO
vital = 1
/obj/item/organ/cell/New()
/obj/item/organ/internal/cell/New()
robotize()
..()
/obj/item/organ/cell/replaced()
/obj/item/organ/internal/cell/replaced()
..()
// This is very ghetto way of rebooting an IPC. TODO better way.
if(owner && owner.stat == DEAD)
@@ -19,59 +19,50 @@
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/mmi_holder
name = "brain"
/obj/item/organ/internal/mmi_holder
name = "brain interface"
organ_tag = "brain"
parent_organ = "head"
parent_organ = BP_HEAD
vital = 1
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/mmi_holder/Destroy()
/obj/item/organ/internal/mmi_holder/Destroy()
stored_mmi = null
return ..()
/obj/item/organ/mmi_holder/New()
..()
/obj/item/organ/internal/mmi_holder/New(var/mob/living/carbon/human/new_owner, var/internal)
..(new_owner, internal)
if(!stored_mmi)
stored_mmi = new(src)
sleep(-1)
update_from_mmi()
spawn(1)
if(!owner)
if(stored_mmi)
stored_mmi.loc = get_turf(src)
qdel(src)
return
update_from_mmi()
if(stored_mmi.brainmob && owner && owner.stat == DEAD)
owner.stat = 0
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/mmi_holder/proc/update_from_mmi()
if(!stored_mmi)
return
/obj/item/organ/internal/mmi_holder/proc/update_from_mmi()
if(!stored_mmi.brainmob)
stored_mmi.brainmob = new(src)
stored_mmi.brainmob = new(stored_mmi)
stored_mmi.brainobj = new(stored_mmi)
stored_mmi.brainmob.container = stored_mmi
stored_mmi.brainmob.real_name = owner.real_name
stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
stored_mmi.name = "[initial(stored_mmi.name)] ([owner.real_name])"
stored_mmi.brainmob.real_name = owner.name
stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
if(owner)
stored_mmi.name = "[initial(stored_mmi.name)] ([owner.name])"
if(!owner) return
name = stored_mmi.name
desc = stored_mmi.desc
icon = stored_mmi.icon
stored_mmi.icon_state = "mmi_full"
icon_state = stored_mmi.icon_state
/obj/item/organ/mmi_holder/removed()
update_from_mmi()
return ..()
if(owner && owner.stat == DEAD)
owner.stat = 0
dead_mob_list -= owner
living_mob_list |= owner
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/mmi_holder/removed(var/mob/living/user)
/obj/item/organ/internal/mmi_holder/removed(var/mob/living/user)
if(stored_mmi)
stored_mmi.loc = get_turf(src)
@@ -84,9 +75,14 @@
holder_mob.drop_from_inventory(src)
qdel(src)
/obj/item/organ/mmi_holder/posibrain
name = "positronic brain"
/obj/item/organ/internal/mmi_holder/posibrain
name = "positronic brain interface"
/obj/item/organ/mmi_holder/posibrain/New()
/obj/item/organ/internal/mmi_holder/posibrain/New()
stored_mmi = new /obj/item/device/mmi/digital/posibrain(src)
..()
/obj/item/organ/internal/mmi_holder/posibrain/update_from_mmi()
..()
stored_mmi.icon_state = "posibrain-occupied"
icon_state = stored_mmi.icon_state
+15 -15
View File
@@ -4,7 +4,7 @@
/obj/item/organ/external/chest
name = "upper body"
limb_name = "chest"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 100
min_broken_damage = 35
@@ -21,34 +21,34 @@
/obj/item/organ/external/groin
name = "lower body"
limb_name = "groin"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 35
w_class = 4
body_part = LOWER_TORSO
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
amputation_point = "lumbar"
joint = "hip"
dislocated = -1
gendered_icon = 1
/obj/item/organ/external/arm
limb_name = "l_arm"
organ_tag = "l_arm"
name = "left arm"
icon_name = "l_arm"
max_damage = 50
min_broken_damage = 30
w_class = 3
body_part = ARM_LEFT
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "left elbow"
amputation_point = "left shoulder"
can_grasp = 1
/obj/item/organ/external/arm/right
limb_name = "r_arm"
organ_tag = "r_arm"
name = "right arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
@@ -56,7 +56,7 @@
amputation_point = "right shoulder"
/obj/item/organ/external/leg
limb_name = "l_leg"
organ_tag = "l_leg"
name = "left leg"
icon_name = "l_leg"
max_damage = 50
@@ -64,13 +64,13 @@
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
parent_organ = BP_GROIN
joint = "left knee"
amputation_point = "left hip"
can_stand = 1
/obj/item/organ/external/leg/right
limb_name = "r_leg"
organ_tag = "r_leg"
name = "right leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
@@ -79,7 +79,7 @@
amputation_point = "right hip"
/obj/item/organ/external/foot
limb_name = "l_foot"
organ_tag = "l_foot"
name = "left foot"
icon_name = "l_foot"
max_damage = 30
@@ -97,7 +97,7 @@
..()
/obj/item/organ/external/foot/right
limb_name = "r_foot"
organ_tag = "r_foot"
name = "right foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
@@ -107,7 +107,7 @@
amputation_point = "right ankle"
/obj/item/organ/external/hand
limb_name = "l_hand"
organ_tag = "l_hand"
name = "left hand"
icon_name = "l_hand"
max_damage = 30
@@ -124,7 +124,7 @@
..()
/obj/item/organ/external/hand/right
limb_name = "r_hand"
organ_tag = "r_hand"
name = "right hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
@@ -133,7 +133,7 @@
amputation_point = "right wrist"
/obj/item/organ/external/head
limb_name = "head"
organ_tag = BP_HEAD
icon_name = "head"
name = "head"
max_damage = 75
@@ -141,7 +141,7 @@
w_class = 3
body_part = HEAD
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "jaw"
amputation_point = "neck"
gendered_icon = 1
+19 -19
View File
@@ -1,52 +1,52 @@
//XENOMORPH ORGANS
/obj/item/organ/xenos
/obj/item/organ/internal/xenos
name = "xeno organ"
icon = 'icons/effects/blood.dmi'
desc = "It smells like an accident in a chemical factory."
/obj/item/organ/xenos/eggsac
/obj/item/organ/internal/xenos/eggsac
name = "egg sac"
parent_organ = "groin"
parent_organ = BP_GROIN
icon_state = "xgibmid1"
organ_tag = "egg sac"
organ_tag = O_EGG
/obj/item/organ/xenos/plasmavessel
/obj/item/organ/internal/xenos/plasmavessel
name = "plasma vessel"
parent_organ = "chest"
parent_organ = BP_TORSO
icon_state = "xgibdown1"
organ_tag = "plasma vessel"
organ_tag = O_PLASMA
var/stored_plasma = 0
var/max_plasma = 500
/obj/item/organ/xenos/plasmavessel/queen
/obj/item/organ/internal/xenos/plasmavessel/queen
name = "bloated plasma vessel"
stored_plasma = 200
max_plasma = 500
/obj/item/organ/xenos/plasmavessel/sentinel
/obj/item/organ/internal/xenos/plasmavessel/sentinel
stored_plasma = 100
max_plasma = 250
/obj/item/organ/xenos/plasmavessel/hunter
/obj/item/organ/internal/xenos/plasmavessel/hunter
name = "tiny plasma vessel"
stored_plasma = 100
max_plasma = 150
/obj/item/organ/xenos/acidgland
/obj/item/organ/internal/xenos/acidgland
name = "acid gland"
parent_organ = "head"
parent_organ = BP_HEAD
icon_state = "xgibtorso"
organ_tag = "acid gland"
organ_tag = O_ACID
/obj/item/organ/xenos/hivenode
/obj/item/organ/internal/xenos/hivenode
name = "hive node"
parent_organ = "chest"
parent_organ = BP_TORSO
icon_state = "xgibmid2"
organ_tag = "hive node"
organ_tag = O_HIVE
/obj/item/organ/xenos/resinspinner
/obj/item/organ/internal/xenos/resinspinner
name = "resin spinner"
parent_organ = "head"
parent_organ = BP_HEAD
icon_state = "xgibmid2"
organ_tag = "resin spinner"
organ_tag = O_RESIN
+2 -2
View File
@@ -140,12 +140,12 @@
return
/obj/item/weapon/paper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(user.zone_sel.selecting == "eyes")
if(user.zone_sel.selecting == O_EYES)
user.visible_message("<span class='notice'>You show the paper to [M]. </span>", \
"<span class='notice'> [user] holds up a paper and shows it to [M]. </span>")
M.examinate(src)
else if(user.zone_sel.selecting == "mouth") // lipstick wiping
else if(user.zone_sel.selecting == O_MOUTH) // lipstick wiping
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H == user)
+2 -2
View File
@@ -136,7 +136,7 @@
Fire(A,user,params) //Otherwise, fire normally.
/obj/item/weapon/gun/attack(atom/A, mob/living/user, def_zone)
if (A == user && user.zone_sel.selecting == "mouth" && !mouthshoot)
if (A == user && user.zone_sel.selecting == O_MOUTH && !mouthshoot)
handle_suicide(user)
else if(user.a_intent == I_HURT) //point blank shooting
Fire(A, user, pointblank=1)
@@ -344,7 +344,7 @@
in_chamber.on_hit(M)
if (in_chamber.damage_type != HALLOSS)
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, BP_HEAD, used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
user.death()
else
user << "<span class = 'notice'>Ow...</span>"
@@ -72,7 +72,7 @@
/datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.check_is_prosthetic())
if(H.isSynthetic())
return
if(data && data["viruses"])
for(var/datum/disease/D in data["viruses"])
@@ -246,7 +246,7 @@
if(prob(50))
M.apply_effect(50, IRRADIATE, check_protection = 0) // curing it that way may kill you instead
var/absorbed = 0
var/obj/item/organ/diona/nutrients/rad_organ = locate() in M.internal_organs
var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in M.internal_organs
if(rad_organ && !rad_organ.is_broken())
absorbed = 1
if(!absorbed)
@@ -323,7 +323,7 @@
if(!M.unacidable && removed > 0)
if(istype(M, /mob/living/carbon/human) && volume >= meltdose)
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ("head")
var/obj/item/organ/external/affecting = H.get_organ(BP_HEAD)
if(affecting)
if(affecting.take_damage(0, removed * power * 0.1))
H.UpdateDamageIcon()
@@ -1763,7 +1763,7 @@
M.adjustToxLoss(2 * removed)
if(dose > 60 && ishuman(M) && prob(5))
var/mob/living/carbon/human/H = M
var/obj/item/organ/heart/L = H.internal_organs_by_name["heart"]
var/obj/item/organ/internal/heart/L = H.internal_organs_by_name[O_HEART]
if (L && istype(L))
if(dose < 120)
L.take_damage(10 * removed, 0)
@@ -255,7 +255,7 @@
M.eye_blind = max(M.eye_blind - 5, 0)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
if(E && istype(E))
if(E.damage > 0)
E.damage = max(E.damage - 5 * removed, 0)
@@ -1540,42 +1540,6 @@
if(wrapped)
Unwrap(user)
/*
On_Consume(var/mob/M)
M << "<span class = 'warning'>Something inside of you suddently expands!</span>"
if (istype(M, /mob/living/carbon/human))
//Do not try to understand.
var/obj/item/weapon/surprise = new/obj/item/weapon(M)
var/mob/ook = monkey_type
surprise.icon = initial(ook.icon)
surprise.icon_state = initial(ook.icon_state)
surprise.name = "malformed [initial(ook.name)]"
surprise.desc = "Looks like \a very deformed [initial(ook.name)], a little small for its kind. It shows no signs of life."
surprise.transform *= 0.6
surprise.add_blood(M)
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/E = H.get_organ("chest")
E.fracture()
for (var/obj/item/organ/I in E.internal_organs)
I.take_damage(rand(I.min_bruised_damage, I.min_broken_damage+1))
if (!E.hidden && prob(60)) //set it snuggly
E.hidden = surprise
E.cavity = 0
else //someone is having a bad day
E.createwound(CUT, 30)
E.embed(surprise)
else if (issmall(M))
M.visible_message("<span class='danger'>[M] suddenly tears in half!</span>")
var/mob/living/carbon/monkey/ook = new monkey_type(M.loc)
ook.name = "malformed [ook.name]"
ook.transform *= 0.6
ook.add_blood(M)
M.gib()
..()
*/
proc/Expand()
src.visible_message("<span class='notice'>\The [src] expands!</span>")
var/mob/living/carbon/human/H = new(src.loc)
@@ -96,7 +96,7 @@
var/datum/reagent/B
if(istype(T, /mob/living/carbon/human))
var/mob/living/carbon/human/H = T
if(H.species && !H.should_have_organ("heart"))
if(H.species && !H.should_have_organ(O_HEART))
H.reagents.trans_to_obj(src, amount)
else
B = T.take_blood(src, amount)
+2 -2
View File
@@ -52,7 +52,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.name != "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
return affected && affected.organ_tag != BP_HEAD && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -91,7 +91,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.name == "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
return affected && affected.organ_tag == BP_HEAD && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \
+2 -2
View File
@@ -12,7 +12,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (!affected || (affected.status & ORGAN_ROBOT))
return 0
return target_zone == "mouth"
return target_zone == O_MOUTH
/datum/surgery_step/generic/cut_face
allowed_tools = list(
@@ -25,7 +25,7 @@
max_duration = 110
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
return ..() && target_zone == "mouth" && target.op_stage.face == 0
return ..() && target_zone == O_MOUTH && target.op_stage.face == 0
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
+14 -14
View File
@@ -8,7 +8,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (isslime(target))
return 0
if (target_zone == "eyes") //there are specific steps for eye surgery
if (target_zone == O_EYES) //there are specific steps for eye surgery
return 0
if (!hasorgans(target))
return 0
@@ -35,7 +35,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != "mouth"
return affected && affected.open == 0 && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -73,7 +73,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != "mouth"
return affected && affected.open == 0 && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -88,7 +88,7 @@
"\blue You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].",)
affected.open = 1
if(istype(target) && target.should_have_organ("heart"))
if(istype(target) && target.should_have_organ(O_HEART))
affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1)
@@ -115,7 +115,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != "mouth"
return affected && affected.open == 0 && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -130,7 +130,7 @@
"\blue You have made an incision on [target]'s [affected.name] with \the [tool].",)
affected.open = 1
if(istype(target) && target.should_have_organ("heart"))
if(istype(target) && target.should_have_organ(O_HEART))
affected.status |= ORGAN_BLEEDING
affected.createwound(CUT, 1)
@@ -195,10 +195,10 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/msg = "[user] starts to pry open the incision on [target]'s [affected.name] with \the [tool]."
var/self_msg = "You start to pry open the incision on [target]'s [affected.name] with \the [tool]."
if (target_zone == "chest")
if (target_zone == BP_TORSO)
msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
if (target_zone == "groin")
if (target_zone == BP_GROIN)
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
user.visible_message(msg, self_msg)
@@ -209,10 +209,10 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/msg = "\blue [user] keeps the incision open on [target]'s [affected.name] with \the [tool]."
var/self_msg = "\blue You keep the incision open on [target]'s [affected.name] with \the [tool]."
if (target_zone == "chest")
if (target_zone == BP_TORSO)
msg = "\blue [user] keeps the ribcage open on [target]'s torso with \the [tool]."
self_msg = "\blue You keep the ribcage open on [target]'s torso with \the [tool]."
if (target_zone == "groin")
if (target_zone == BP_GROIN)
msg = "\blue [user] keeps the incision open on [target]'s lower abdomen with \the [tool]."
self_msg = "\blue You keep the incision open on [target]'s lower abdomen with \the [tool]."
user.visible_message(msg, self_msg)
@@ -222,10 +222,10 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/msg = "\red [user]'s hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!"
var/self_msg = "\red Your hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!"
if (target_zone == "chest")
if (target_zone == BP_TORSO)
msg = "\red [user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!"
self_msg = "\red Your hand slips, damaging several organs in [target]'s torso with \the [tool]!"
if (target_zone == "groin")
if (target_zone == BP_GROIN)
msg = "\red [user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]"
self_msg = "\red Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
user.visible_message(msg, self_msg)
@@ -245,7 +245,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open && target_zone != "mouth"
return affected && affected.open && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -278,7 +278,7 @@
max_duration = 160
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (target_zone == "eyes") //there are specific steps for eye surgery
if (target_zone == O_EYES) //there are specific steps for eye surgery
return 0
if (!hasorgans(target))
return 0
+1 -1
View File
@@ -153,7 +153,7 @@
max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/sponge = target.internal_organs_by_name["brain"]
return ..() && (!sponge || !sponge.damage)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+17 -28
View File
@@ -35,7 +35,7 @@
if (!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && embryo && affected.open == 3 && target_zone == "chest"
return ..() && affected && embryo && affected.open == 3 && target_zone == BP_TORSO
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
@@ -218,8 +218,8 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
if((I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs
@@ -262,7 +262,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/O = tool
var/obj/item/organ/internal/O = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!affected) return
var/organ_compatible
@@ -275,35 +275,24 @@
user << "<span class='danger'>You cannot install a naked organ into a robotic body.</span>"
return SURGERY_FAILURE
if(!target.species)
user << "<span class='danger'>You have no idea what species this person is. Report this on the bug tracker.</span>"
return SURGERY_FAILURE
var/o_is = (O.gender == PLURAL) ? "are" : "is"
var/o_a = (O.gender == PLURAL) ? "" : "a "
var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't"
if(O.organ_tag == "limb")
return 0
else if(target.should_have_organ(O.organ_tag))
if(O.damage > (O.max_damage * 0.75))
user << "<span class='warning'>\The [O.organ_tag] [o_is] in no state to be transplanted.</span>"
return SURGERY_FAILURE
if(O.damage > (O.max_damage * 0.75))
user << "<span class='warning'>\The [O.organ_tag] [o_is] in no state to be transplanted.</span>"
return SURGERY_FAILURE
if(!target.internal_organs_by_name[O.organ_tag])
organ_missing = 1
else
user << "<span class='warning'>\The [target] already has [o_a][O.organ_tag].</span>"
return SURGERY_FAILURE
if(O && affected.limb_name == O.parent_organ)
organ_compatible = 1
else
user << "<span class='warning'>\The [O.organ_tag] [o_do] normally go in \the [affected.name].</span>"
return SURGERY_FAILURE
if(!target.internal_organs_by_name[O.organ_tag])
organ_missing = 1
else
user << "<span class='warning'>You're pretty sure [target.species.name_plural] don't normally have [o_a][O.organ_tag].</span>"
user << "<span class='warning'>\The [target] already has [o_a][O.organ_tag].</span>"
return SURGERY_FAILURE
if(O && affected.organ_tag == O.parent_organ)
organ_compatible = 1
else
user << "<span class='warning'>\The [O.organ_tag] [o_do] normally go in \the [affected.name].</span>"
return SURGERY_FAILURE
return ..() && organ_missing && organ_compatible
@@ -350,7 +339,7 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
if(I && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
if(istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
+3 -3
View File
@@ -70,7 +70,7 @@
if(!hasorgans(target))
return 0
if (target_zone == "mouth" || target_zone == "eyes")
if (target_zone == O_MOUTH || target_zone == O_EYES)
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -123,7 +123,7 @@
if(!hasorgans(target))
return 0
if (target_zone == "mouth" || target_zone == "eyes")
if (target_zone == O_MOUTH || target_zone == O_EYES)
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -188,7 +188,7 @@
var/obj/item/weapon/weldingtool/welder = tool
if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove)
return (target_zone == BP_TORSO) && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove)
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts cutting through the support systems of [target]'s [target.back] with \the [tool]." , \
+15 -18
View File
@@ -8,7 +8,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (isslime(target))
return 0
if (target_zone == "eyes") //there are specific steps for eye surgery
if (target_zone == O_EYES) //there are specific steps for eye surgery
return 0
if (!hasorgans(target))
return 0
@@ -34,7 +34,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open == 0 && target_zone != "mouth"
return affected && affected.open == 0 && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -78,7 +78,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("<span class='notice'>[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>", \
"<span class='notice'>You open the maintenance hatch on [target]'s [affected.name] with \the [tool].</span>")
affected.open = 2
affected.open = 3
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -98,7 +98,7 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return affected && affected.open && target_zone != "mouth"
return affected && affected.open && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -134,7 +134,7 @@
var/obj/item/weapon/weldingtool/welder = tool
if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
return affected && affected.open == 2 && affected.brute_dam > 0 && target_zone != "mouth"
return affected && affected.open == 3 && (affected.disfigured || affected.brute_dam > 0) && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -147,7 +147,7 @@
user.visible_message("<span class='notice'>[user] finishes patching damage to [target]'s [affected.name] with \the [tool].</span>", \
"<span class='notice'>You finish patching damage to [target]'s [affected.name] with \the [tool].</span>")
affected.heal_damage(rand(30,50),0,1,1)
affected.disfigured = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("<span class='warning'>[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].</span>",
@@ -166,7 +166,7 @@
if(..())
var/obj/item/stack/cable_coil/C = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/limb_can_operate = (affected && affected.open == 2 && affected.burn_dam > 0 && target_zone != "mouth")
var/limb_can_operate = (affected && affected.open == 2 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH)
if(limb_can_operate)
if(istype(C))
if(!C.get_amount() >= 3)
@@ -193,6 +193,7 @@
user.visible_message("<span class='warning'>[user] causes a short circuit in [target]'s [affected.name]!</span>",
"<span class='warning'>You cause a short circuit in [target]'s [affected.name]!</span>")
target.apply_damage(rand(5,10), BURN, affected)
affected.disfigured = 0
/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs
allowed_tools = list(
@@ -215,7 +216,7 @@
if(I.damage > 0 && (I.status & ORGAN_ROBOT))
is_organ_damaged = 1
break
return affected.open == 2 && is_organ_damaged
return affected.open == 3 && is_organ_damaged
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -276,7 +277,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && (affected.status & ORGAN_ROBOT)))
return 0
if(affected.open != 2)
if(affected.open < 3)
return 0
target.op_stage.current_organ = null
@@ -304,7 +305,7 @@
user.visible_message("<span class='notice'>[user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool].</span>" , \
"<span class='notice'>You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].</span>")
var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
if(I && istype(I))
I.status |= ORGAN_CUT_AWAY
@@ -325,7 +326,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && (affected.status & ORGAN_ROBOT)))
return 0
if(affected.open != 2)
if(affected.open < 3)
return 0
target.op_stage.current_organ = null
@@ -370,12 +371,12 @@
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(target_zone != "head")
if(target_zone != BP_HEAD)
return
var/obj/item/device/mmi/M = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && affected.open == 2))
if(!(affected && affected.open == 3))
return 0
if(!istype(M))
@@ -389,10 +390,6 @@
user << "<span class='danger'>You cannot install a computer brain into a meat skull.</span>"
return SURGERY_FAILURE
if(!target.species)
user << "<span class='danger'>You have no idea what species this person is. Report this on the bug tracker.</span>"
return SURGERY_FAILURE
if(!target.should_have_organ("brain"))
user << "<span class='danger'>You're pretty sure [target.species.name_plural] don't normally have a brain.</span>"
return SURGERY_FAILURE
@@ -415,7 +412,7 @@
"<span class='notice'>You have installed \the [tool] into [target]'s [affected.name].</span>")
var/obj/item/device/mmi/M = tool
var/obj/item/organ/mmi_holder/holder = new(target, 1)
var/obj/item/organ/internal/mmi_holder/holder = new(target, 1)
target.internal_organs_by_name["brain"] = holder
user.drop_from_inventory(tool)
tool.loc = holder
+3 -3
View File
@@ -85,7 +85,7 @@
if (G.state < 2)
if(user.a_intent == I_HURT)
if (prob(15)) M.Weaken(5)
M.apply_damage(8,def_zone = "head")
M.apply_damage(8,def_zone = BP_HEAD)
visible_message("<span class='danger'>[G.assailant] slams [G.affecting]'s face against \the [src]!</span>")
if(material)
playsound(loc, material.tableslam_noise, 50, 1)
@@ -97,9 +97,9 @@
if(prob(50))
M.visible_message("<span class='danger'>\The [S] slices [M]'s face messily!</span>",
"<span class='danger'>\The [S] slices your face messily!</span>")
M.apply_damage(10, def_zone = "head")
M.apply_damage(10, def_zone = BP_HEAD)
if(prob(2))
M.embed(S, def_zone = "head")
M.embed(S, def_zone = BP_HEAD)
else
user << "<span class='danger'>You need a better grip to do that!</span>"
return
+2 -2
View File
@@ -55,7 +55,7 @@
if(is_train_head() && !on)
return 0
//space check ~no flying space trains sorry
if(on && istype(destination, /turf/space))
return 0
@@ -146,7 +146,7 @@
verbs += /obj/vehicle/train/cargo/engine/verb/stop_engine
/obj/vehicle/train/cargo/RunOver(var/mob/living/carbon/human/H)
var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm")
var/list/parts = list(BP_HEAD, BP_TORSO, BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)
H.apply_effects(5, 5)
for(var/i = 0, i < rand(1,3), i++)
+1 -1
View File
@@ -237,7 +237,7 @@
activate(var/mob/living/carbon/mob,var/multiplier)
if(istype(mob, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mob
var/obj/item/organ/brain/B = H.internal_organs_by_name["brain"]
var/obj/item/organ/internal/brain/B = H.internal_organs_by_name["brain"]
if (B && B.damage < B.min_broken_damage)
B.take_damage(5)
else
+1 -1
View File
@@ -16,7 +16,7 @@
var/mob/living/carbon/C = M
if (istype(C,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = C
if(!H.should_have_organ("heart"))
if(!H.should_have_organ(O_HEART))
report("Scan aborted: The target does not have blood.", user)
return