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

WIP
Allowed heads/bodies to be prosthetic. Removed IPC. Refactored some flags.
This commit is contained in:
Zuhayr
2015-12-18 18:23:58 +10:30
parent c886810238
commit d71573e749
102 changed files with 925 additions and 722 deletions

View File

@@ -19,7 +19,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
vessel = new/datum/reagents(600)
vessel.my_atom = src
if(species && species.flags & NO_BLOOD) //We want the var for safety but we can do without the actual blood.
if(!should_have_organ("heart")) //We want the var for safety but we can do without the actual blood.
return
vessel.add_reagent("blood",560)
@@ -30,7 +30,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/human/proc/fixblood()
for(var/datum/reagent/blood/B in vessel.reagent_list)
if(B.id == "blood")
B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.blood_color,"blood_type"=dna.b_type, \
B.data = list( "donor"=src,"viruses"=null,"species"=species.name,"blood_DNA"=dna.unique_enzymes,"blood_colour"= species.get_blood_colour(src),"blood_type"=dna.b_type, \
"resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = list())
B.color = B.data["blood_colour"]
@@ -39,7 +39,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(in_stasis)
return
if(species && species.flags & NO_BLOOD)
if(!should_have_organ("heart"))
return
if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
@@ -62,7 +62,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
// Damaged heart virtually reduces the blood volume, as the blood isn't
// being pumped properly anymore.
if(species && species.has_organ["heart"])
if(species && should_have_organ("heart"))
var/obj/item/organ/heart/heart = internal_organs_by_name["heart"]
if(!heart)
@@ -126,7 +126,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Bleeding out
var/blood_max = 0
for(var/obj/item/organ/external/temp in organs)
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
if(!(temp.status & ORGAN_BLEEDING) || (temp.status & ORGAN_ROBOT))
continue
for(var/datum/wound/W in temp.wounds) if(W.bleeding())
blood_max += W.damage / 40
@@ -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(species && species.flags & NO_BLOOD) //TODO: Make drips come from the reagents instead.
if(!should_have_organ("heart")) //TODO: Make drips come from the reagents instead.
return
if(!amt)
@@ -175,7 +175,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
// Putting this here due to return shenanigans.
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
B.data["blood_colour"] = H.species.blood_color
B.data["blood_colour"] = H.species.get_blood_colour(H)
B.color = B.data["blood_colour"]
var/list/temp_chem = list()
@@ -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(species && species.flags & NO_BLOOD)
if(!should_have_organ("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(species.flags & NO_BLOOD)
if(should_have_organ("heart"))
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return

View File

@@ -46,7 +46,8 @@
/obj/item/organ/stack
name = "cortical stack"
parent_organ = "head"
robotic = 2
icon_state = "brain-prosthetic"
organ_tag = "stack"
vital = 1
var/backup_time = 0
var/datum/mind/backup
@@ -56,15 +57,5 @@
backup_time = world.time
if(owner.mind) backup = owner.mind
/obj/item/organ/stack/vox
/obj/item/organ/stack/vox/stack
/obj/item/organ/stack
name = "cortical stack"
icon_state = "brain-prosthetic"
organ_tag = "stack"
robotic = 2
/obj/item/organ/stack/vox
name = "vox cortical stack"

View File

@@ -3,33 +3,37 @@ var/list/organ_cache = list()
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
germ_level = 0
// Strings.
var/organ_tag = "organ"
var/parent_organ = "chest"
// Appearance.
var/dead_icon
var/mob/living/carbon/human/owner = null
// Status tracking.
var/status = 0
var/vital //Lose a vital limb, die immediately.
var/damage = 0 // amount of damage to the organ
var/min_bruised_damage = 10
var/min_broken_damage = 30
var/max_damage
var/organ_tag = "organ"
var/parent_organ = "chest"
var/robotic = 0 //For being a robot
var/rejecting // Is this organ already being rejected?
// 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,
// links chemical IDs to number of ticks for which they'll stay in the blood
germ_level = 0
var/datum/dna/dna
var/datum/species/species
// Damage vars.
var/min_bruised_damage = 10
var/min_broken_damage = 30
var/max_damage
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
@@ -42,7 +46,7 @@ var/list/organ_cache = list()
owner.organs_by_name -= src
if(src in owner.contents)
owner.contents -= src
owner = null
return ..()
/obj/item/organ/proc/update_health()
@@ -189,8 +193,25 @@ var/list/organ_cache = list()
/obj/item/organ/proc/receive_chem(chemical as obj)
return 0
/obj/item/organ/proc/rejuvenate()
/obj/item/organ/proc/rejuvenate(var/ignore_prosthetic_prefs)
damage = 0
status = 0
if(!ignore_prosthetic_prefs && owner && owner.client && owner.client.prefs && owner.client.prefs.real_name == owner.real_name)
var/status = owner.client.prefs.organ_data[organ_tag]
if(status == "assisted")
mechassist()
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
@@ -241,19 +262,13 @@ var/list/organ_cache = list()
owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
src.status &= ~ORGAN_BROKEN
src.status &= ~ORGAN_BLEEDING
src.status &= ~ORGAN_SPLINTED
src.status &= ~ORGAN_CUT_AWAY
src.status &= ~ORGAN_DESTROYED
src.status |= ORGAN_ROBOT
src.status |= ORGAN_ASSISTED
status = 0
status |= ORGAN_ASSISTED
status |= ORGAN_ROBOT
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
robotize()
src.status &= ~ORGAN_ROBOT
robotic = 1
status = 0
status |= ORGAN_ASSISTED
min_bruised_damage = 15
min_broken_damage = 35
@@ -320,8 +335,6 @@ var/list/organ_cache = list()
target.internal_organs |= src
affected.internal_organs |= src
target.internal_organs_by_name[organ_tag] = src
if(robotic)
status |= ORGAN_ROBOT
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
@@ -335,10 +348,10 @@ var/list/organ_cache = list()
/obj/item/organ/proc/bitten(mob/user)
if(robotic)
if(status & ORGAN_ROBOT)
return
user << "\blue You take an experimental bite out of \the [src]."
user << "<span class='notice'>You take an experimental bite out of \the [src].</span>"
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
blood_splatter(src,B,1)
@@ -361,6 +374,9 @@ var/list/organ_cache = list()
/obj/item/organ/attack_self(mob/user as mob)
// Convert it to an edible form, yum yum.
if(!robotic && user.a_intent == "help" && user.zone_sel.selecting == "mouth")
if((status & ORGAN_ROBOT) && user.a_intent == "help" && user.zone_sel.selecting == "mouth")
bitten(user)
return
/obj/item/organ/proc/can_feel_pain()
return !(status & (ORGAN_ROBOT|ORGAN_DESTROYED)) && !(species.flags & NO_PAIN)

View File

@@ -14,49 +14,57 @@
dir = SOUTH
organ_tag = "limb"
var/brute_mod = 1
var/burn_mod = 1
// Strings
var/limb_name
// 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
// Appearance vars.
var/icon_name = null
var/body_part = null
var/icon_position = 0
var/model
var/force_icon
var/damage_state = "00"
var/brute_dam = 0
var/burn_dam = 0
var/max_size = 0
var/last_dam = -1
var/icon/mob_icon
var/gendered_icon = 0
var/limb_name
var/disfigured = 0
var/cannot_amputate
var/cannot_break
var/s_tone
var/list/s_col
var/list/h_col
var/body_hair
// 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/perma_injury = 0
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/damage_msg = "\red You feel an intense pain"
var/broken_description
var/open = 0
var/stage = 0
var/cavity = 0
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/encased // Needs to be opened with a saw to access the organs.
var/list/implants = list()
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
// 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/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand
var/body_hair
var/encased // Needs to be opened with a saw to access the organs.
// Surgery vars.
var/open = 0
var/stage = 0
var/cavity = 0
/obj/item/organ/external/Destroy()
if(parent && parent.children)
@@ -188,12 +196,6 @@
parent.children = list()
parent.children.Add(src)
/obj/item/organ/external/robotize()
..()
//robit limbs take reduced damage
brute_mod = 0.8
burn_mod = 0.8
/****************************************************
DAMAGE PROCS
****************************************************/
@@ -219,7 +221,7 @@
brute -= brute / 2
if(status & ORGAN_BROKEN && prob(40) && brute)
if (!(owner.species && (owner.species.flags & NO_PAIN)))
if(!((species.flags & NO_PAIN) || (status & ORGAN_ROBOT)))
owner.emote("scream") //getting hit on broken hand hurts
if(used_weapon)
add_autopsy_data("[used_weapon]", brute + burn)
@@ -316,7 +318,6 @@
if(internal)
status &= ~ORGAN_BROKEN
perma_injury = 0
/*if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS))
var/obj/item/organ/external/stump/S = locate() in children
@@ -333,13 +334,10 @@
/*
This function completely restores a damaged organ to perfect condition.
*/
/obj/item/organ/external/rejuvenate()
/obj/item/organ/external/rejuvenate(var/ignore_prosthetic_prefs)
damage_state = "00"
if(status & 128) //Robotic organs stay robotic. Fix because right click rejuvinate makes IPC's organs organic.
status = 128
else
status = 0
perma_injury = 0
status = 0
brute_dam = 0
burn_dam = 0
germ_level = 0
@@ -348,16 +346,44 @@ This function completely restores a damaged organ to perfect condition.
// handle internal organs
for(var/obj/item/organ/current_organ in internal_organs)
current_organ.rejuvenate()
current_organ.rejuvenate(ignore_prosthetic_prefs)
// remove embedded objects and drop them on the floor
for(var/obj/implanted_object in implants)
if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc.
implanted_object.loc = owner.loc
implanted_object.loc = get_turf(src)
implants -= implanted_object
owner.updatehealth()
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]
if(status == "amputated")
remove_rejuv()
else if(status == "cyborg")
var/robodata = owner.client.prefs.rlimb_data[limb_name]
if(robodata)
robotize(robodata)
else
robotize()
owner.updatehealth()
/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
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)
/obj/item/organ/external/proc/createwound(var/type = CUT, var/damage)
if(damage == 0) return
@@ -384,13 +410,13 @@ This function completely restores a damaged organ to perfect condition.
W.open_wound(damage)
if(prob(25))
if(status & ORGAN_ROBOT)
owner.visible_message("\red The damage to [owner.name]'s [name] worsens.",\
"\red The damage to your [name] worsens.",\
"You hear the screech of abused metal.")
owner.visible_message("<span class='danger'>The damage to [owner.name]'s [name] worsens.</span>",\
"<span class='danger'>The damage to your [name] worsens.</span>",\
"<span class='danger'>You hear the screech of abused metal.</span>")
else
owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\
"\red The wound on your [name] widens with a nasty ripping noise.",\
"You hear a nasty ripping noise, as if flesh is being torn apart.")
owner.visible_message("<span class='danger'>The wound on [owner.name]'s [name] widens with a nasty ripping noise.</span>",\
"<span class='danger'>The wound on your [name] widens with a nasty ripping noise.</span>",\
"<span class='danger'>You hear a nasty ripping noise, as if flesh is being torn apart.</span>")
return
//Creating wound
@@ -451,9 +477,6 @@ This function completely restores a damaged organ to perfect condition.
if(trace_chemicals[chemID] <= 0)
trace_chemicals.Remove(chemID)
if(!(status & ORGAN_BROKEN))
perma_injury = 0
//Infections
update_germs()
else
@@ -629,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.species.flags & NO_BLOOD)))
if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ("heart")))
W.bleed_timer--
status |= ORGAN_BLEEDING
@@ -638,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.species.flags & NO_BLOOD)))
if (open && !clamped && (H && H.should_have_organ("heart")))
status |= ORGAN_BLEEDING
//Bone fractures
@@ -687,7 +710,7 @@ Note that amputating the affected organ does in fact remove the infection from t
****************************************************/
//Handles dismemberment
/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children)
/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children, var/silent)
if(cannot_amputate || !owner)
return
@@ -762,12 +785,18 @@ Note that amputating the affected organ does in fact remove the infection from t
I.loc = get_turf(src)
qdel(src)
if(DROPLIMB_BLUNT)
var/obj/effect/decal/cleanable/blood/gibs/gore = new victim.species.single_gib_type(get_turf(victim))
if(victim.species.flesh_color)
gore.fleshcolor = victim.species.flesh_color
if(victim.species.blood_color)
gore.basecolor = victim.species.blood_color
gore.update_icon()
var/obj/effect/decal/cleanable/blood/gibs/gore
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))
if(species)
if(species.get_flesh_colour())
gore.fleshcolor = species.get_flesh_colour()
if(species.get_blood_colour())
gore.basecolor = species.get_blood_colour()
gore.update_icon()
gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
for(var/obj/item/organ/I in internal_organs)
@@ -849,15 +878,14 @@ Note that amputating the affected organ does in fact remove the infection from t
if(owner)
owner.visible_message(\
"\red You hear a loud cracking sound coming from \the [owner].",\
"\red <b>Something feels like it shattered in your [name]!</b>",\
"You hear a sickening crack.")
if(owner.species && !(owner.species.flags & NO_PAIN))
"<span class='danger'>You hear a loud cracking sound coming from \the [owner].</span>",\
"<span class='danger'>Something feels like it shattered in your [name]!</span>",\
"<span class='danger'>You hear a sickening crack.</span>")
if(!(species.flags & NO_PAIN))
owner.emote("scream")
status |= ORGAN_BROKEN
broken_description = pick("broken","fracture","hairline fracture")
perma_injury = brute_dam
// Fractures have a chance of getting you out of restraints
if (prob(25))
@@ -891,26 +919,55 @@ 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)
/obj/item/organ/external/robotize(var/company, var/ski)
if(status & ORGAN_ROBOT)
return
..()
brute_mod = 0.8
burn_mod = 0.8
brute_mod = 0.8
burn_mod = 0.8
if(company)
model = company
var/datum/robolimb/R = all_robolimbs[company]
if(species && (species.name in R.species_cannot_use))
if(!R || (species && (species.name in R.species_cannot_use)))
R = basic_robolimb
if(R)
force_icon = R.icon
name = "[R.company] [initial(name)]"
desc = "[R.desc]"
name = "robotic [initial(name)]"
desc = "[R.desc] It looks like it was produced by [R.company]."
dislocated = -1 //TODO, make robotic limbs a separate type, remove snowflake
dislocated = -1
cannot_break = 1
get_icon()
unmutate()
for (var/obj/item/organ/external/T in children)
if(T)
T.robotize()
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)
while(null in owner.internal_organs)
owner.internal_organs -= null
while(null in owner.internal_organs_by_name)
owner.internal_organs -= null
return 1
/obj/item/organ/external/proc/mutate()
if(src.status & ORGAN_ROBOT)
@@ -923,7 +980,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(owner) owner.update_body()
/obj/item/organ/external/proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use max_damage?
return (brute_dam+burn_dam) //could use max_damage?
/obj/item/organ/external/proc/has_infected_wound()
for(var/datum/wound/W in wounds)
@@ -1012,13 +1069,13 @@ Note that amputating the affected organ does in fact remove the infection from t
return
if(owner)
if(type == "brute")
owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s [name].", \
"\red <b>Your [name] becomes a mangled mess!</b>", \
"\red You hear a sickening crack.")
owner.visible_message("<span class='danger'>You hear a sickening cracking sound coming from \the [owner]'s [name].</span>", \
"<span class='danger'>Your [name] becomes a mangled mess!</span>", \
"<span class='danger'>You hear a sickening crack.</span>")
else
owner.visible_message("\red \The [owner]'s [name] melts away, turning into mangled mess!", \
"\red <b>Your [name] melts away!</b>", \
"\red You hear a sickening sizzle.")
owner.visible_message("<span class='danger'>\The [owner]'s [name] melts away, turning into mangled mess!</span>", \
"<span class='danger'>Your [name] melts away!</span>", \
"<span class='danger'>You hear a sickening sizzle.</span>")
disfigured = 1
/obj/item/organ/external/proc/get_wounds_desc()
@@ -1098,6 +1155,12 @@ Note that amputating the affected organ does in fact remove the infection from t
parent_organ = null
encased = "ribcage"
/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)
/obj/item/organ/external/groin
name = "lower body"
limb_name = "groin"
@@ -1224,6 +1287,8 @@ Note that amputating the affected organ does in fact remove the infection from t
gendered_icon = 1
encased = "skull"
var/eye_icon = "eyes_s"
/obj/item/organ/external/head/removed()
if(owner)
name = "[owner.real_name]'s head"
@@ -1244,3 +1309,32 @@ Note that amputating the affected organ does in fact remove the infection from t
disfigure("brute")
if (burn_dam > 40)
disfigure("burn")
/obj/item/organ/external/head/skrell
eye_icon = "skrell_eyes_s"
/obj/item/organ/external/head/resomi
eye_icon = "eyes_resomi"
/obj/item/organ/external/head/vox
eye_icon = "vox_eyes_s"
/obj/item/organ/external/head/no_eyes
eye_icon = "blank_eyes"
/obj/item/organ/external/head/no_eyes/diona
max_damage = 50
min_broken_damage = 25
cannot_break = 1
amputation_point = "branch"
joint = "structural ligament"
dislocated = -1
vital = 0
/obj/item/organ/external/head/no_eyes/diona/removed()
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)))
qdel(src)

View File

@@ -53,10 +53,10 @@ var/global/list/limb_icon_cache = list()
overlays.Cut()
if(!owner || !owner.species)
return
if(owner.species.has_organ["eyes"])
if(owner.should_have_organ("eyes"))
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(species.eyes)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
if(eye_icon)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', eye_icon)
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
else
@@ -91,7 +91,7 @@ var/global/list/limb_icon_cache = list()
var/gender
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name]")
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_f" : ""]")
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]")

View File

@@ -70,6 +70,13 @@
parent_organ = "head"
var/list/eye_colour = list(0,0,0)
/obj/item/organ/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()
if(!owner)
return
@@ -109,7 +116,7 @@
if (germ_level > INFECTION_LEVEL_ONE)
if(prob(1))
owner << "\red Your skin itches."
owner << "<span class='danger'>Your skin itches.</span>"
if (germ_level > INFECTION_LEVEL_TWO)
if(prob(1))
spawn owner.vomit()

View File

@@ -8,9 +8,9 @@ mob/var/next_pain_time = 0
// partname is the name of a body part
// amount is a num from 1 to 100
mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0)
if(stat >= 1)
if(stat >= 1)
return
if(species && (species.flags & NO_PAIN))
if(!can_feel_pain())
return
if(analgesic > 40)
return
@@ -25,13 +25,13 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
if(burning)
switch(amount)
if(1 to 10)
msg = "\red <b>Your [partname] burns.</b>"
msg = "<span class='danger'>Your [partname] burns.</span>"
if(11 to 90)
flash_weak_pain()
msg = "\red <b><font size=2>Your [partname] burns badly!</font></b>"
msg = "<span class='danger'><font size=2>Your [partname] burns badly!</font></span>"
if(91 to 10000)
flash_pain()
msg = "\red <b><font size=3>OH GOD! Your [partname] is on fire!</font></b>"
msg = "<span class='danger'><font size=3>OH GOD! Your [partname] is on fire!</font></span>"
else
switch(amount)
if(1 to 10)
@@ -51,9 +51,9 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
// message is the custom message to be displayed
// flash_strength is 0 for weak pain flash, 1 for strong pain flash
mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
if(stat >= 1)
if(stat >= 1)
return
if(species.flags & NO_PAIN)
if(!can_feel_pain())
return
if(reagents.has_reagent("tramadol"))
return
@@ -61,9 +61,9 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
return
if(analgesic)
return
var/msg = "\red <b>[message]</b>"
var/msg = "<span class='danger'>[message]</span>"
if(flash_strength >= 1)
msg = "\red <font size=3><b>[message]</b></font>"
msg = "<span class='danger'><font size=3>[message]</font></span>"
// Anti message spam checks
if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time)))
@@ -74,7 +74,7 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
mob/living/carbon/human/proc/handle_pain()
// not when sleeping
if(species.flags & NO_PAIN) return
if(!can_feel_pain()) return
if(stat >= 2) return
if(analgesic > 70)

View File

@@ -41,4 +41,3 @@ var/global/datum/robolimb/basic_robolimb
company = "Morpheus Cyberkinetics"
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'
unavailable_at_chargen = 1

View File

@@ -122,22 +122,6 @@
body_part = HAND_RIGHT
parent_organ = "r_arm"
/obj/item/organ/external/diona/head
limb_name = "head"
icon_name = "head"
name = "head"
max_damage = 50
min_broken_damage = 25
w_class = 3
body_part = HEAD
parent_organ = "chest"
/obj/item/organ/external/diona/head/removed()
if(owner)
owner.u_equip(owner.head)
owner.u_equip(owner.l_ear)
..()
//DIONA ORGANS.
/obj/item/organ/external/diona/removed()
var/mob/living/carbon/human/H = owner

View File

@@ -1,77 +1,3 @@
// IPC limbs.
/obj/item/organ/external/head/ipc
dislocated = -1
can_intake_reagents = 0
vital = 0
max_damage = 50 //made same as arm, since it is not vital
min_broken_damage = 30
encased = null
/obj/item/organ/external/head/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/chest/ipc
dislocated = -1
encased = null
/obj/item/organ/external/chest/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/groin/ipc
dislocated = -1
/obj/item/organ/external/groin/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/arm/ipc
dislocated = -1
/obj/item/organ/external/arm/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/arm/right/ipc
dislocated = -1
/obj/item/organ/external/arm/right/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/leg/ipc
dislocated = -1
/obj/item/organ/external/leg/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/leg/right/ipc
dislocated = -1
/obj/item/organ/external/leg/right/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/foot/ipc
dislocated = -1
/obj/item/organ/external/foot/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/foot/right/ipc
dislocated = -1
/obj/item/organ/external/foot/right/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/hand/ipc
dislocated = -1
/obj/item/organ/external/hand/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/external/hand/right/ipc
dislocated = -1
/obj/item/organ/external/hand/right/ipc/New()
robotize("Morpheus Cyberkinetics")
..()
/obj/item/organ/cell
name = "microbattery"
desc = "A small, powerful cell for use in fully prosthetic bodies."
@@ -92,34 +18,59 @@
owner.stat = 0
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/optical_sensor
name = "optical sensor"
organ_tag = "eyes"
parent_organ = "head"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
dead_icon = "camera_broken"
/obj/item/organ/optical_sensor/New()
robotize()
..()
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/mmi_holder
name = "brain"
organ_tag = "brain"
parent_organ = "chest"
parent_organ = "head"
vital = 1
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/mmi_holder/Destroy()
stored_mmi = null
return ..()
/obj/item/organ/mmi_holder/New()
..()
if(!stored_mmi)
stored_mmi = new(src)
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
if(!stored_mmi.brainmob)
stored_mmi.brainmob = new(src)
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])"
name = stored_mmi.name
desc = stored_mmi.desc
icon = stored_mmi.icon
icon_state = stored_mmi.icon_state
/obj/item/organ/mmi_holder/removed()
update_from_mmi()
return ..()
/obj/item/organ/mmi_holder/removed(var/mob/living/user)
if(stored_mmi)
@@ -133,25 +84,9 @@
holder_mob.drop_from_inventory(src)
qdel(src)
/obj/item/organ/mmi_holder/New()
..()
// This is very ghetto way of rebooting an IPC. TODO better way.
spawn(1)
if(owner && owner.stat == DEAD)
owner.stat = 0
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/mmi_holder/posibrain
name = "positronic brain"
/obj/item/organ/mmi_holder/posibrain/New()
robotize()
stored_mmi = new /obj/item/device/mmi/digital/posibrain(src)
..()
spawn(1)
if(owner)
stored_mmi.name = "positronic brain ([owner.name])"
stored_mmi.brainmob.real_name = owner.name
stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
stored_mmi.icon_state = "posibrain-occupied"
update_from_mmi()
else
stored_mmi.loc = get_turf(src)
qdel(src)