Merge remote-tracking branch 'polaris/master' into pl-chemistry

This commit is contained in:
GinjaNinja32
2015-12-24 15:06:16 +00:00
243 changed files with 2401 additions and 1971 deletions

View File

@@ -880,12 +880,15 @@ var/list/admin_verbs_mentor = list(
if(new_fstyle)
M.f_style = new_fstyle
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neuter")
if (new_gender)
if(new_gender == "Male")
M.gender = MALE
else
else if (new_gender == "Female")
M.gender = FEMALE
else
M.gender = NEUTER
M.update_hair()
M.update_body()
M.check_dna(M)

View File

@@ -278,8 +278,8 @@ Ccomp's first proc.
G.can_reenter_corpse = 1
G:show_message(text("\blue <B>You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead.</B>"), 1)
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit")
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1)
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 15 minute respawn limit")
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 15 minute respawn limit", 1)
/client/proc/toggle_antagHUD_use()

View File

@@ -1,7 +1,7 @@
/datum/category_item/player_setup_item/general/basic
name = "Basic"
sort_order = 1
var/list/valid_player_genders = list(MALE, FEMALE)
var/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL)
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name

View File

@@ -75,8 +75,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
pref.update_preview_icon()
if(pref.preview_icon_front && pref.preview_icon_side)
user << browse_rsc(pref.preview_icon_front, "previewicon.png")
user << browse_rsc(pref.preview_icon_side, "previewicon2.png")
user << browse_rsc(pref.preview_icon_front, "preview_icon.png")
user << browse_rsc(pref.preview_icon_side, "preview_icon2.png")
var/mob_species = all_species[pref.species]
. += "<table><tr style='vertical-align:top'><td><b>Body</b> "
@@ -87,7 +87,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(has_flag(mob_species, HAS_SKIN_TONE))
. += "Skin Tone: <a href='?src=\ref[src];skin_tone=1'>[-pref.s_tone + 35]/220</a><br>"
. += "Needs Glasses: <a href='?src=\ref[src];disabilities=[NEARSIGHTED]'><b>[pref.disabilities & NEARSIGHTED ? "Yes" : "No"]</b></a><br>"
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a><br>"
. += "Limbs: <a href='?src=\ref[src];limbs=1'>Adjust</a> <a href='?src=\ref[src];reset_limbs=1'>Reset</a><br>"
. += "Internal Organs: <a href='?src=\ref[src];organs=1'>Adjust</a><br>"
//display limbs below
@@ -96,26 +96,35 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/status = pref.organ_data[name]
var/organ_name = null
switch(name)
if("l_arm")
if(BP_TORSO)
organ_name = "torso"
if(BP_GROIN)
organ_name = "groin"
if(BP_HEAD)
organ_name = "head"
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(O_BRAIN)
organ_name = "brain"
if(status == "cyborg")
++ind
@@ -136,7 +145,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
++ind
if(ind > 1)
. += ", "
. += "\tMechanical [organ_name]"
. += "\tSynthetic [organ_name]"
else if(status == "assisted")
++ind
if(ind > 1)
@@ -148,6 +157,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "\tSurgically altered [organ_name]"
if("eyes")
. += "\tRetinal overlayed [organ_name]"
if("brain")
. += "\tAssisted-interface [organ_name]"
else
. += "\tMechanically assisted [organ_name]"
if(!ind)
@@ -155,7 +166,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else
. += "<br><br>"
. += "</td><td><b>Preview</b><br><img src=previewicon.png height=64 width=64><img src=previewicon2.png height=64 width=64>"
. += "</td><td><b>Preview</b><br><img src=preview_icon.png height=64 width=64><img src=preview_icon2.png height=64 width=64>"
. += "</td></tr></table>"
. += "<b>Hair</b><br>"
@@ -252,6 +263,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_hair = 0//hex2num(copytext(new_hair, 6, 8))
pref.s_tone = 0
reset_limbs() // Safety for species with incompatible manufacturers; easier than trying to do it case by case.
return TOPIC_REFRESH
else if(href_list["hair_color"])
@@ -334,50 +346,78 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.f_style = new_f_style
return TOPIC_REFRESH
else if(href_list["reset_limbs"])
reset_limbs()
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")
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)
if("Left Leg")
limb = "l_leg"
second_limb = "l_foot"
if("Right Leg")
limb = "r_leg"
second_limb = "r_foot"
if("Left Arm")
limb = "l_arm"
second_limb = "l_hand"
if("Right Arm")
limb = "r_arm"
second_limb = "r_hand"
if("Left Foot")
limb = "l_foot"
third_limb = "l_leg"
if("Right Foot")
limb = "r_foot"
third_limb = "r_leg"
if("Left Hand")
limb = "l_hand"
third_limb = "l_arm"
if("Right Hand")
limb = "r_hand"
third_limb = "r_arm"
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis")
// Do not let them amputate their entire body, ty.
var/list/choice_options = list("Normal","Amputated","Prothesis")
switch(organ_tag)
if("Left Leg")
limb = BP_L_LEG
second_limb = BP_L_FOOT
if("Right Leg")
limb = BP_R_LEG
second_limb = BP_R_FOOT
if("Left Arm")
limb = BP_L_ARM
second_limb = BP_L_HAND
if("Right Arm")
limb = BP_R_ARM
second_limb = BP_R_HAND
if("Left Foot")
limb = BP_L_FOOT
third_limb = BP_L_LEG
if("Right Foot")
limb = BP_R_FOOT
third_limb = BP_R_LEG
if("Left Hand")
limb = BP_L_HAND
third_limb = BP_L_ARM
if("Right Hand")
limb = BP_R_HAND
third_limb = BP_R_ARM
if("Full Body")
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 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 == BP_TORSO)
return
pref.organ_data[limb] = "amputated"
pref.rlimb_data[limb] = null
if(second_limb)
@@ -397,27 +437,51 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in usable_manufacturers
if(!choice)
return
pref.rlimb_data[limb] = choice
pref.organ_data[limb] = "cyborg"
if(second_limb)
pref.rlimb_data[second_limb] = choice
pref.organ_data[second_limb] = "cyborg"
if(third_limb && pref.organ_data[third_limb] == "amputated")
pref.organ_data[third_limb] = null
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[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")
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[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)
@@ -436,6 +500,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return ..()
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
for(var/organ in pref.organ_data)
pref.organ_data[organ] = null
while(null in pref.organ_data)
pref.organ_data -= null
for(var/organ in pref.rlimb_data)
pref.rlimb_data[organ] = null
while(null in pref.rlimb_data)
pref.rlimb_data -= null
/datum/category_item/player_setup_item/general/body/proc/SetSpecies(mob/user)
if(!pref.species_preview || !(pref.species_preview in all_species))
pref.species_preview = "Human"
@@ -455,10 +531,10 @@ 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.flags & NO_BLOOD)
dat += "</br><b>Does not have blood.</b>"
if(current_species.flags & NO_BREATHE)
dat += "</br><b>Does not breathe.</b>"
if(!current_species.has_organ[O_HEART])
dat += "</br><b>Does not have a circulatory system.</b>"
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>"
if(current_species.flags & NO_PAIN)

View File

@@ -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>"

View File

@@ -304,50 +304,39 @@ 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(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
character.socks = socks
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
if(character.gender in list(PLURAL, NEUTER))
if(isliving(src)) //Ghosts get neuter by default
message_admins("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.")
character.gender = MALE
character.update_body()
/datum/preferences/proc/open_load_dialog(mob/user)
var/dat = "<body>"

View File

@@ -120,3 +120,7 @@
/obj/item/clothing/head/surgery/green
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is dark green."
icon_state = "surgcap_green"
/obj/item/clothing/head/surgery/black
desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs. This one is black."
icon_state = "surgcap_black"

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>")

View File

@@ -99,33 +99,31 @@
var/sound = "heartbeat"
var/sound_strength = "cannot hear"
var/heartbeat = 0
if(M.species && M.species.has_organ["heart"])
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
if(heart && !heart.robotic)
heartbeat = 1
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))
sound_strength = "cannot hear"
sound = "anything"
else
switch(body_part)
if("chest")
if(BP_TORSO)
sound_strength = "hear"
sound = "no heartbeat"
if(heartbeat)
var/obj/item/organ/heart/heart = M.internal_organs_by_name["heart"]
if(heart.is_bruised() || M.getOxyLoss() > 50)
sound = "[pick("odd noises in","weak")] heartbeat"
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

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

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>",

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)

View File

@@ -41,14 +41,6 @@ var/list/weighted_mundaneevent_locations = list()
[pick("mind-machine interfacing","neuroscience","nano-augmentation","genetics")]. [company_name] is expected to announce a co-exploitation deal within the fortnight."
return null
/datum/trade_destination/icarus
name = "NDV Icarus"
description = "Corvette assigned to patrol local space."
distance = 0.1
willing_to_buy = list()
willing_to_sell = list()
viable_random_events = list(SECURITY_BREACH, AI_LIBERATION, PIRATES)
/datum/trade_destination/redolant
name = "OAV Redolant"
description = "Osiris Atmospherics station in orbit around the only gas giant insystem. They retain tight control over shipping rights, and Osiris warships protecting their prize are not an uncommon sight in Tau Ceti."

View File

@@ -8,7 +8,8 @@
/datum/event/brand_intelligence/announce()
command_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by.", "Machine Learning Alert")
command_announcement.Announce("An ongoing mass upload of malware for vendors has been detected onboard [station_name()], which appears to transmit \
to other nearby vendors. The original infected machine is believed to be \a [originMachine.name].", "Vendor Service Alert")
/datum/event/brand_intelligence/start()

View File

@@ -3,13 +3,13 @@
endWhen = 30
/datum/event/dust/announce()
command_announcement.Announce("The station is now passing through a belt of space dust.", "Dust Alert")
command_announcement.Announce("Debris resulting from activity on another nearby asteroid is approaching your colony.", "Dust Alert")
/datum/event/dust/start()
dust_swarm(get_severity())
/datum/event/dust/end()
command_announcement.Announce("The station has now passed through the belt of space dust.", "Dust Notice")
command_announcement.Announce("The colony is no longer in danger of impact from space debris.", "Dust Notice")
/datum/event/dust/proc/get_severity()
switch(severity)

View File

@@ -4,7 +4,7 @@
/datum/event/electrical_storm/announce()
command_announcement.Announce("An electrical storm has been detected in your area, please repair potential electronic overloads.", "Electrical Storm Alert")
command_announcement.Announce("An electrical issue has been detected in your area, please repair potential electronic overloads.", "Electrical Alert")
/datum/event/electrical_storm/start()

View File

@@ -160,7 +160,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 20, list(ASSIGNMENT_SECURITY = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 30, list(ASSIGNMENT_ENGINEER = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 150), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
)
@@ -174,7 +173,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0,list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 0, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
)

View File

@@ -76,7 +76,6 @@ var/list/event_last_fired = list()
if(active_with_role["Medical"] > 0)
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/viral_infection] = active_with_role["Medical"] * 10
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
if(active_with_role["Security"] > 0)

View File

@@ -5,7 +5,8 @@
endWhen = rand(15, 60)
/datum/event/gravity/announce()
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes.", "Gravity Failure")
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \
reinitializes. Please stand by while the gravity system reinitializes.", "Gravity Failure")
/datum/event/gravity/start()
gravity_is_on = 0

View File

@@ -1,13 +1,12 @@
#define LOC_KITCHEN 0
#define LOC_ATMOS 1
#define LOC_INCIN 2
#define LOC_CHAPEL 3
#define LOC_LIBRARY 4
#define LOC_HYDRO 5
#define LOC_VAULT 6
#define LOC_CONSTR 7
#define LOC_TECH 8
#define LOC_TACTICAL 9
#define LOC_CHAPEL 2
#define LOC_LIBRARY 3
#define LOC_HYDRO 4
#define LOC_VAULT 5
#define LOC_CONSTR 6
#define LOC_TECH 7
#define LOC_TACTICAL 8
#define VERM_MICE 0
#define VERM_LIZARDS 1
@@ -23,7 +22,7 @@
/datum/event/infestation/start()
location = rand(0,9)
location = rand(0,8)
var/list/turf/simulated/floor/turfs = list()
var/spawn_area_type
switch(location)
@@ -33,9 +32,6 @@
if(LOC_ATMOS)
spawn_area_type = /area/engineering/atmos
locstring = "atmospherics"
if(LOC_INCIN)
spawn_area_type = /area/maintenance/incinerator
locstring = "the incinerator"
if(LOC_CHAPEL)
spawn_area_type = /area/chapel/main
locstring = "the chapel"
@@ -101,7 +97,6 @@
#undef LOC_KITCHEN
#undef LOC_ATMOS
#undef LOC_INCIN
#undef LOC_CHAPEL
#undef LOC_LIBRARY
#undef LOC_HYDRO

View File

@@ -13,9 +13,9 @@
/datum/event/meteor_wave/announce()
switch(severity)
if(EVENT_LEVEL_MAJOR)
command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
command_announcement.Announce("Meteors have been detected on collision course with the colony.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
else
command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
command_announcement.Announce("The colony is now in a meteor shower.", "Meteor Alert")
/datum/event/meteor_wave/tick()
if(waves && activeFor >= next_meteor)
@@ -32,9 +32,9 @@
/datum/event/meteor_wave/end()
switch(severity)
if(EVENT_LEVEL_MAJOR)
command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
command_announcement.Announce("The colony has cleared the meteor storm.", "Meteor Alert")
else
command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
command_announcement.Announce("The colony has cleared the meteor shower", "Meteor Alert")
/datum/event/meteor_wave/proc/get_meteors()
switch(severity)

View File

@@ -17,7 +17,7 @@
T.amount = winner_sum
T.date = current_date_string
T.time = worldtime2text()
T.source_terminal = "Biesel TCD Terminal #[rand(111,333)]"
T.source_terminal = "Sif TCD Terminal #[rand(111,333)]"
D.transaction_log.Add(T)
deposit_success = 1

View File

@@ -23,12 +23,21 @@
/datum/event/rogue_drone/announce()
var/msg
if(prob(33))
msg = "A combat drone wing operating out of the NDV Icarus has failed to return from a sweep of this sector, if any are sighted approach with caution."
else if(prob(50))
msg = "Contact has been lost with a combat drone wing operating out of the NDV Icarus. If any are sighted in the area, approach with caution."
else
msg = "Unidentified hackers have targetted a combat drone wing deployed from the NDV Icarus. If any are sighted in the area, approach with caution."
var/rng = rand(1,5)
switch(rng)
if(1)
msg = "A combat drone wing operating near various asteroids in the Kara subsystem has failed to return from a anti-piracy sweep. If any are sighted, \
approach with caution."
if(2)
msg = "Contact has been lost with a combat drone wring operating out in the asteroid field near Kara. If any are sighted in the area, approach with \
caution."
if(3)
msg = "Unidentified hackers have targeted a combat drone wing deployed in the Kara subsystem. If any are sighted in the area, approach with caution."
if(4)
msg = "A passing derelict ship's drone defense systems have just activated. If any are sighted in the area, use caution."
if(5)
msg = "We're detecting a swarm of small objects approaching your station. Most likely a bunch of drones. Please exercise caution if you see any."
command_announcement.Announce(msg, "Rogue drone alert")
/datum/event/rogue_drone/end()
@@ -44,6 +53,6 @@
num_recovered++
if(num_recovered > drones_list.len * 0.75)
command_announcement.Announce("Icarus drone control reports the malfunctioning wing has been recovered safely.", "Rogue drone alert")
command_announcement.Announce("The drones that were malfunctioning have been recovered safely.", "Rogue drone alert")
else
command_announcement.Announce("Icarus drone control registers disappointment at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")
command_announcement.Announce("We're disappointed at the loss of the drones, but the survivors have been recovered.", "Rogue drone alert")

View File

@@ -3,7 +3,7 @@ datum/event/wallrot/setup()
endWhen = announceWhen + 1
datum/event/wallrot/announce()
command_announcement.Announce("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
command_announcement.Announce("Harmful fungi detected on the colony. Station structures may be contaminated.", "Biohazard Alert")
datum/event/wallrot/start()
spawn()

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

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()

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

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")

View File

@@ -40,7 +40,6 @@
new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
))
recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1)
@@ -107,10 +106,10 @@
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4)
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
/material/cardboard/generate_recipes()
..()

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
@@ -745,3 +745,14 @@ var/list/name_to_material
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
/material/toy_foam
name = "foam"
display_name = "foam"
use_name = "foam"
flags = MATERIAL_PADDING
ignition_point = T0C+232
melting_point = T0C+300
icon_colour = "#ff9900"
hardness = 1
weight = 1

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])

View File

@@ -7,7 +7,7 @@
usr << "You are unable to emote."
return
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
if(m_type == 2 && muzzled) return
var/input

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)

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

View File

@@ -96,23 +96,24 @@
/datum/language/machine
name = "Encoded Audio Language"
desc = "A language of encoded tones that allow for IPCs to communicate auditorily between each other in a manner that allows for easier transfer of information."
speech_verb = "beeps"
ask_verb = "beeps"
exclaim_verb = "loudly beeps"
desc = "A efficient language of encoded tones developed by synthetics and cyborgs."
speech_verb = "whistles"
ask_verb = "chirps"
exclaim_verb = "whistles loudly"
colour = "changeling"
key = "6"
flags = RESTRICTED | NO_STUTTER
flags = NO_STUTTER
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
/*

View File

@@ -8,7 +8,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
switch(act)
if ("me")

View File

@@ -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)

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
@@ -60,7 +59,7 @@
brainobj = O
brainobj.loc = src
name = "Man-Machine Interface: [brainmob.real_name]"
name = "man-machine interface ([brainmob.real_name])"
icon_state = "mmi_full"
locked = 1
@@ -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)

View File

@@ -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,70 +15,86 @@
attack_verb = list("attacked", "slapped", "whacked")
var/mob/living/carbon/brain/brainmob = null
/obj/item/organ/pariah_brain
/obj/item/organ/internal/brain/robotize()
replace_self_with(/obj/item/organ/internal/mmi_holder/posibrain)
/obj/item/organ/internal/brain/mechassist()
replace_self_with(/obj/item/organ/internal/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/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()
@@ -90,16 +106,14 @@
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."
robotic = 2
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."
robotic = 2
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"

View File

@@ -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)

View File

@@ -7,7 +7,7 @@
/mob/living/carbon/proc/breathe()
//if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
if(species && (species.flags & NO_BREATHE) || does_not_breathe) return
if(!should_have_organ(O_LUNGS) || does_not_breathe) return
var/datum/gas_mixture/breath = null

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()
@@ -472,3 +472,11 @@
if(!species)
return null
return species.default_language ? all_languages[species.default_language] : null
/mob/living/carbon/proc/should_have_organ(var/organ_check)
return 0
/mob/living/carbon/proc/can_feel_pain(var/check_organ)
if(isSynthetic())
return 0
return !(species.flags & NO_PAIN)

View File

@@ -8,7 +8,7 @@
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B && B.host_brain)
src << "\red <B>You withdraw your probosci, releasing control of [B.host_brain]</B>"
src << "<span class='danger'>You withdraw your probosci, releasing control of [B.host_brain]</span>"
B.detatch()
@@ -17,7 +17,7 @@
verbs -= /mob/living/carbon/proc/spawn_larvae
else
src << "\red <B>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</B>"
src << "<span class='danger'>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</span>"
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
@@ -31,13 +31,12 @@
return
if(B.host_brain.ckey)
src << "\red <B>You send a punishing spike of psychic agony lancing into your host's brain.</B>"
if (species && (species.flags & NO_PAIN))
B.host_brain << "\red You feel a strange sensation as a foreign influence prods your mind."
src << "\red <B>It doesn't seem to be as effective as you hoped.</B>"
src << "<span class='danger'>You send a punishing spike of psychic agony lancing into your host's brain.</span>"
if (!can_feel_pain())
B.host_brain << "<span class='warning'>You feel a strange sensation as a foreign influence prods your mind.</span>"
src << "<span class='danger'>It doesn't seem to be as effective as you hoped.</span>"
else
B.host_brain << "\red <B><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></B>"
B.host_brain << "<span class='danger'><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></span>"
/mob/living/carbon/proc/spawn_larvae()
set category = "Abilities"
@@ -50,15 +49,14 @@
return
if(B.chemicals >= 100)
src << "\red <B>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</B>"
visible_message("\red <B>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</B>")
src << "<span class='danger'>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</span>"
visible_message("<span class='danger'>\The [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</span>")
B.chemicals -= 100
B.has_reproduced = 1
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
vomit(1)
new /mob/living/simple_animal/borer(get_turf(src))
else
src << "You do not have enough chemicals stored to reproduce."
src << "<span class='warning'>You do not have enough chemicals stored to reproduce.</span>"
return

View File

@@ -157,30 +157,44 @@
return valid_species
/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(BP_HEAD)
if(H) use_species = H.species.get_bodytype()
var/list/valid_hairstyles = new()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
if(check_gender && gender == MALE && S.gender == FEMALE)
continue
if(check_gender && gender == FEMALE && S.gender == MALE)
continue
if(!(species.get_bodytype() in S.species_allowed))
if(check_gender && gender != NEUTER)
if(gender == MALE && S.gender == FEMALE)
continue
else if(gender == FEMALE && S.gender == MALE)
continue
if(!(use_species in S.species_allowed))
continue
valid_hairstyles += hairstyle
return valid_hairstyles
/mob/living/carbon/human/proc/generate_valid_facial_hairstyles()
var/use_species = species.get_bodytype()
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()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
if(gender == MALE && S.gender == FEMALE)
continue
if(gender == FEMALE && S.gender == MALE)
continue
if(!(species.get_bodytype() in S.species_allowed))
if(gender != NEUTER)
if(gender == MALE && S.gender == FEMALE)
continue
else if(gender == FEMALE && S.gender == MALE)
continue
if(!(use_species in S.species_allowed))
continue
valid_facial_hairstyles += facialhairstyle

View File

@@ -15,7 +15,7 @@
I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(1,3), round(30/I.w_class))
..(species.gibbed_anim)
gibs(loc, viruses, dna, null, species.flesh_color, species.blood_color)
gibs(loc, viruses, dna, null, species.get_flesh_colour(src), species.get_blood_colour(src))
/mob/living/carbon/human/dust()
if(species)
@@ -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)
@@ -68,7 +68,7 @@
if(wearing_rig)
wearing_rig.notify_ai("<span class='danger'>Warning: user death event. Mobility control passed to integrated intelligence system.</span>")
return ..(gibbed,species.death_message)
return ..(gibbed,species.get_death_message(src))
/mob/living/carbon/human/proc/ChangeToHusk()
if(HUSK in mutations) return

View File

@@ -9,7 +9,7 @@
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
var/muzzled = is_muzzled()
//var/m_type = 1
for (var/obj/item/weapon/implant/I in src)
@@ -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
@@ -207,7 +239,7 @@
m_type = 2
if ("deathgasp")
message = "[species.death_message]"
message = "[species.get_death_message()]"
m_type = 1
if ("giggle")

View File

@@ -38,9 +38,21 @@
CRASH("Gender datum was null; key was '[(skipjumpsuit && skipface) ? PLURAL : gender]'")
msg += "<EM>[src.name]</EM>"
if(species.name != "Human")
msg += ", a <b><font color='[species.flesh_color]'>[species.name]</font></b>"
msg += "!\n"
var/is_synth = isSynthetic()
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>"
else if(species.name != "Human")
msg += ", <b><font color='[species.get_flesh_colour(src)]'>\a [species.name]!</font></b>"
msg += "<br>"
//uniform
if(w_uniform && !skipjumpsuit)
@@ -52,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?
@@ -123,30 +135,34 @@
//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)
var/descriptor = "on [T.his] face"
if(istype(wear_mask, /obj/item/weapon/grenade) && check_has_mouth())
descriptor = "in [T.his] mouth"
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] [descriptor]!</span>\n"
else
msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] on [T.his] face.\n"
msg += "[T.He] [T.has] \icon[wear_mask] \a [wear_mask] [descriptor].\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"
@@ -182,7 +198,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"
@@ -230,11 +246,12 @@
if(getBrainLoss() >= 60)
msg += "[T.He] [T.has] a stupid expression on [T.his] face.\n"
if(species.show_ssd && (!species.has_organ["brain"] || has_brain()) && stat != DEAD)
var/ssd_msg = species.get_ssd(src)
if(ssd_msg && (!should_have_organ("brain") || has_brain()) && stat != DEAD)
if(!key)
msg += "<span class='deadsay'>[T.He] [T.is] [species.show_ssd]. It doesn't look like [T.he] [T.is] waking up anytime soon.</span>\n"
msg += "<span class='deadsay'>[T.He] [T.is] [ssd_msg]. It doesn't look like [T.he] [T.is] waking up anytime soon.</span>\n"
else if(!client)
msg += "<span class='deadsay'>[T.He] [T.is] [species.show_ssd].</span>\n"
msg += "<span class='deadsay'>[T.He] [T.is] [ssd_msg].</span>\n"
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
@@ -261,12 +278,12 @@
is_destroyed["[temp.name]"] = 1
wound_flavor_text["[temp.name]"] = "<span class='warning'><b>[T.He] [T.is] missing [T.his] [temp.name].</b></span>\n"
continue
if(temp.status & ORGAN_ROBOT)
if(!is_synth && temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]!</span>\n"
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a [temp.name]!</span>\n"
continue
else
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a robot [temp.name]. It has[temp.get_wounds_desc()]!</span>\n"
wound_flavor_text["[temp.name]"] = "<span class='warning'>[T.He] [T.has] a [temp.name]. It has[temp.get_wounds_desc()]!</span>\n"
else if(temp.wounds.len > 0 || temp.open)
if(temp.is_stump() && temp.parent_organ && organs_by_name[temp.parent_organ])
var/obj/item/organ/external/parent = organs_by_name[temp.parent_organ]
@@ -282,79 +299,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

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
@@ -654,18 +640,12 @@
///eyecheck()
///Returns a number between -1 to 2
/mob/living/carbon/human/eyecheck()
var/obj/item/organ/I = internal_organs_by_name[O_EYES]
if(!I || I.status & (ORGAN_CUT_AWAY|ORGAN_DESTROYED))
return 2
var/number = 0
if(!species.has_organ["eyes"]) //No eyes, can't hurt them.
return 2
if(internal_organs_by_name["eyes"]) // Eyes are fucked, not a 'weak point'.
var/obj/item/organ/I = internal_organs_by_name["eyes"]
if(I.status & ORGAN_CUT_AWAY)
return 2
else
return 2
if(istype(src.head, /obj/item/clothing/head/welding))
if(!src.head:up)
number += 2
@@ -690,8 +670,6 @@
//Used by various things that knock people out by applying blunt trauma to the head.
//Checks that the species has a "head" (brain containing organ) and that hit_zone refers to it.
/mob/living/carbon/human/proc/headcheck(var/target_zone, var/brain_tag = "brain")
if(!species.has_organ[brain_tag])
return 0
var/obj/item/organ/affecting = internal_organs_by_name[brain_tag]
@@ -745,38 +723,16 @@
xylophone=0
return
/mob/living/carbon/human/proc/check_has_mouth()
/mob/living/proc/check_has_mouth()
return 1
/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
/mob/living/carbon/human/proc/vomit()
if(!check_has_mouth())
return
if(!lastpuke)
lastpuke = 1
src << "<span class='warning'>You feel nauseous...</span>"
spawn(150) //15 seconds until second warning
src << "<span class='warning'>You feel like you are about to throw up!</span>"
spawn(100) //and you have 10 more for mad dash to the bucket
Stun(5)
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/location = loc
if (istype(location, /turf/simulated))
location.add_vomit_floor(src, 1)
nutrition -= 40
adjustToxLoss(-3)
spawn(350) //wait 35 seconds before next volley
lastpuke = 0
/mob/living/carbon/human/proc/morph()
set name = "Morph"
set category = "Superpower"
@@ -846,12 +802,14 @@
if(new_style)
f_style = new_style
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neutral")
if (new_gender)
if(new_gender == "Male")
gender = MALE
else
else if(new_gender == "Female")
gender = FEMALE
else
gender = NEUTER
regenerate_icons()
check_dna()
@@ -936,16 +894,15 @@
/mob/living/carbon/human/revive()
if(species && !(species.flags & NO_BLOOD))
if(should_have_organ(O_HEART))
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
// Fix up all organs.
// This will ignore any prosthetics in the prefs currently.
species.create_organs(src)
species.create_organs(src) // Reset our organs/limbs.
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)
@@ -964,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)
@@ -1057,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(species.flags & NO_PAIN)
if(!can_feel_pain(organ.organ_tag))
src << "<span class='warning'>You feel [O] moving inside your [organ.name].</span>"
else
var/msg = pick( \
@@ -1067,7 +1024,7 @@
src << msg
organ.take_damage(rand(1,3), 0, 0)
if(!(organ.status & ORGAN_ROBOT) && !(species.flags & NO_BLOOD)) //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))
@@ -1169,6 +1126,8 @@
qdel(hud_used)
hud_used = new /datum/hud(src)
full_prosthetic = null
if(species)
return 1
else
@@ -1234,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
@@ -1248,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
@@ -1256,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)
@@ -1302,23 +1261,27 @@
/mob/living/carbon/human/getDNA()
if(species.flags & NO_SCAN)
return null
if(isSynthetic())
return
..()
/mob/living/carbon/human/setDNA()
if(species.flags & NO_SCAN)
return
if(isSynthetic())
return
..()
/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
@@ -1423,3 +1386,28 @@
pulling_punches = !pulling_punches
src << "<span class='notice'>You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].</span>"
return
/mob/living/carbon/human/should_have_organ(var/organ_check)
var/obj/item/organ/external/affecting
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
return (species && species.has_organ[organ_check])
/mob/living/carbon/human/can_feel_pain(var/obj/item/organ/check_organ)
if(isSynthetic())
return 0
if(check_organ)
if(!istype(check_organ))
return 0
return check_organ.can_feel_pain()
return !(species.flags & NO_PAIN)
/mob/living/carbon/human/is_muzzled()
return (wear_mask && (istype(wear_mask, /obj/item/clothing/mask/muzzle) || istype(src.wear_mask, /obj/item/weapon/grenade)))

View File

@@ -118,6 +118,16 @@
if(I_HURT)
if(M.zone_sel.selecting == "mouth" && wear_mask && istype(wear_mask, /obj/item/weapon/grenade))
var/obj/item/weapon/grenade/G = wear_mask
if(!G.active)
visible_message("<span class='danger'>\The [M] pulls the pin from \the [src]'s [G.name]!</span>")
G.activate(M)
update_inv_wear_mask()
else
M << "<span class='warning'>\The [G] is already primed! Run!</span>"
return
if(!istype(H))
attack_generic(H,rand(1,3),"punched")
return
@@ -180,7 +190,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

View File

@@ -13,7 +13,7 @@
total_brute += O.brute_dam
total_burn += O.burn_dam
var/oxy_l = ((species.flags & NO_BREATHE) ? 0 : getOxyLoss())
var/oxy_l = getOxyLoss()
var/tox_l = ((species.flags & NO_POISON) ? 0 : getToxLoss())
var/clone_l = getCloneLoss()
@@ -28,8 +28,8 @@
if(status_flags & GODMODE) return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(should_have_organ("brain"))
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.take_damage(amount)
brainloss = sponge.damage
@@ -42,8 +42,8 @@
if(status_flags & GODMODE) return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(should_have_organ("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
@@ -56,8 +56,8 @@
if(status_flags & GODMODE) return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(should_have_organ("brain"))
var/obj/item/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
brainloss = min(sponge.damage,maxHealth*2)
else
@@ -142,12 +142,12 @@
..()
/mob/living/carbon/human/getCloneLoss()
if(species.flags & (NO_SCAN))
if((species.flags & NO_SCAN) || isSynthetic())
cloneloss = 0
return ..()
/mob/living/carbon/human/setCloneLoss(var/amount)
if(species.flags & (NO_SCAN))
if((species.flags & NO_SCAN) || isSynthetic())
cloneloss = 0
else
..()
@@ -155,7 +155,7 @@
/mob/living/carbon/human/adjustCloneLoss(var/amount)
..()
if(species.flags & (NO_SCAN))
if((species.flags & NO_SCAN) || isSynthetic())
cloneloss = 0
return
@@ -189,37 +189,37 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/getOxyLoss()
if(species.flags & NO_BREATHE)
if(!should_have_organ(O_LUNGS))
oxyloss = 0
return ..()
/mob/living/carbon/human/adjustOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
if(!should_have_organ(O_LUNGS))
oxyloss = 0
else
amount = amount*species.oxy_mod
..(amount)
/mob/living/carbon/human/setOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
if(!should_have_organ(O_LUNGS))
oxyloss = 0
else
..()
/mob/living/carbon/human/getToxLoss()
if(species.flags & NO_POISON)
if((species.flags & NO_POISON) || isSynthetic())
toxloss = 0
return ..()
/mob/living/carbon/human/adjustToxLoss(var/amount)
if(species.flags & NO_POISON)
if((species.flags & NO_POISON) || isSynthetic())
toxloss = 0
else
amount = amount*species.toxins_mod
..(amount)
/mob/living/carbon/human/setToxLoss(var/amount)
if(species.flags & NO_POISON)
if((species.flags & NO_POISON) || isSynthetic())
toxloss = 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(!(species.flags & NO_BLOOD))
if(should_have_organ(O_HEART))
var/blood_volume = vessel.get_reagent_amount("blood")
vessel.add_reagent("blood",560.0-blood_volume)
@@ -329,9 +329,9 @@ This function restores the subjects blood to max.
/*
This function restores all organs.
*/
/mob/living/carbon/human/restore_all_organs()
/mob/living/carbon/human/restore_all_organs(var/ignore_prosthetic_prefs)
for(var/obj/item/organ/external/current_organ in organs)
current_organ.rejuvenate()
current_organ.rejuvenate(ignore_prosthetic_prefs)
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
var/obj/item/organ/external/E = get_organ(zone)
@@ -345,23 +345,29 @@ 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)
if(Debug2)
world.log << "## DEBUG: human/apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]."
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
organ = def_zone
else
if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone))
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
if(damagetype == HALLOSS && !(species && (species.flags & NO_PAIN)))
if ((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
emote("scream")
if(damagetype == HALLOSS)
if((damage > 25 && prob(20)) || (damage > 50 && prob(60)))
if(organ && organ.can_feel_pain())
emote("scream")
..(damage, damagetype, def_zone, blocked)
return 1
@@ -371,12 +377,7 @@ This function restores all organs.
if(blocked >= 100)
return 0
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
organ = def_zone
else
if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone))
if(!organ) return 0
if(blocked)

View File

@@ -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
@@ -61,7 +61,7 @@ emp_act
emote("me", 1, "drops what they were holding, their [affected.name] malfunctioning!")
else
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
emote("me", 1, "[(species && species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [affected.name]!")
emote("me", 1, "[affected.can_feel_pain() ? "" : emote_scream]drops what they were holding in their [affected.name]!")
..(stun_amount, agony_amount, def_zone)
@@ -223,7 +223,7 @@ emp_act
//Harder to score a stun but if you do it lasts a bit longer
if(prob(effective_force))
apply_effect(20, PARALYZE, armor)
visible_message("<span class='danger'>[src] [species.knockout_message]</span>")
visible_message("<span class='danger'>[src] [species.get_knockout_message(src)]</span>")
else
//Easier to score a stun but lasts less time
if(prob(effective_force + 10))
@@ -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

View File

@@ -82,7 +82,9 @@
var/list/flavor_texts = list()
var/gunshot_residue
var/pulling_punches // Are you trying not to hurt your opponent?
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

View File

@@ -16,7 +16,7 @@
var/health_deficiency = (100 - health)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
if (!(species && (species.flags & NO_PAIN)))
if(can_feel_pain())
if(halloss >= 10) tally += (halloss / 10) //halloss shouldn't slow you down if you can't even feel it
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
@@ -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,11 +38,11 @@
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
if(E.status & ORGAN_SPLINTED)
else if(E.status & ORGAN_SPLINTED)
tally += 0.5
else if(E.status & ORGAN_BROKEN)
tally += 1.5

View File

@@ -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()
@@ -68,6 +68,7 @@
if (istype(buckled, /obj/structure/bed))
return
var/limb_pain
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)))
@@ -88,6 +89,8 @@
else if (E.is_dislocated())
stance_damage += 0.5
if(E) limb_pain = E.can_feel_pain()
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
// Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you.
@@ -99,7 +102,7 @@
// standing is poor
if(stance_damage >= 4 || (stance_damage >= 2 && prob(5)))
if(!(lying || resting))
if(species && !(species.flags & NO_PAIN))
if(limb_pain)
emote("scream")
custom_emote(1, "collapses!")
Weaken(5) //can't emote while weakened, apparently.
@@ -110,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>")
@@ -118,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>")
@@ -145,7 +148,7 @@
drop_from_inventory(r_hand)
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
emote("me", 1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
emote("me", 1, "[(E.can_feel_pain()) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
else if(E.is_malfunctioning())
switch(E.body_part)

View File

@@ -40,50 +40,49 @@ This saves us from having to call add_fingerprint() any time something is put in
/mob/living/carbon/human/proc/has_organ(name)
var/obj/item/organ/external/O = organs_by_name[name]
return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump())
/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)

View File

@@ -254,7 +254,8 @@
radiation = Clamp(radiation,0,100)
if (radiation)
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
@@ -274,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)
@@ -365,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(species.has_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())
@@ -519,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)
@@ -685,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
@@ -831,6 +840,7 @@
return min(1,thermal_protection)
/mob/living/carbon/human/handle_chemicals_in_body()
if(in_stasis)
return
@@ -838,43 +848,48 @@
chem_effects.Cut()
analgesic = 0
if(touching) touching.metabolize()
if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize()
if(!isSynthetic())
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
if(touching) touching.metabolize()
if(ingested) ingested.metabolize()
if(bloodstr) bloodstr.metabolize()
var/total_phoronloss = 0
for(var/obj/item/I in src)
if(I.contaminated)
total_phoronloss += vsc.plc.CONTAMINATION_LOSS
if(!(status_flags & GODMODE)) adjustToxLoss(total_phoronloss)
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
var/total_phoronloss = 0
for(var/obj/item/I in src)
if(I.contaminated)
total_phoronloss += vsc.plc.CONTAMINATION_LOSS
if(!(status_flags & GODMODE)) adjustToxLoss(total_phoronloss)
if(status_flags & GODMODE) return 0 //godmode
var/obj/item/organ/diona/node/light_organ = locate() in internal_organs
if(light_organ && !light_organ.is_broken())
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
if(L)
light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
else
light_amount = 5
nutrition += light_amount
traumatic_shock -= light_amount
var/obj/item/organ/internal/diona/node/light_organ = locate() in internal_organs
if(species.flags & IS_PLANT)
if(nutrition > 450)
nutrition = 450
if(light_amount >= 3) //if there's enough light, heal
adjustBruteLoss(-(round(light_amount/2)))
adjustFireLoss(-(round(light_amount/2)))
adjustToxLoss(-(light_amount))
adjustOxyLoss(-(light_amount))
//TODO: heal wounds, heal broken limbs.
if(!isSynthetic())
if(light_organ && !light_organ.is_broken())
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(loc)) //else, there's considered to be no light
var/turf/T = loc
var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T
if(L)
light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights
else
light_amount = 5
nutrition += light_amount
traumatic_shock -= light_amount
if(species.flags & IS_PLANT)
if(nutrition > 450)
nutrition = 450
if(light_amount >= 3) //if there's enough light, heal
adjustBruteLoss(-(round(light_amount/2)))
adjustFireLoss(-(round(light_amount/2)))
adjustToxLoss(-(light_amount))
adjustOxyLoss(-(light_amount))
//TODO: heal wounds, heal broken limbs.
if(species.light_dam)
var/light_amount = 0
@@ -901,13 +916,14 @@
if(overeatduration > 1)
overeatduration -= 2 //doubled the unfat rate
if(species.flags & IS_PLANT && (!light_organ || light_organ.is_broken()))
if(!isSynthetic() && (species.flags & IS_PLANT) && (!light_organ || light_organ.is_broken()))
if(nutrition < 200)
take_overall_damage(2,0)
traumatic_shock++
// TODO: stomach and bloodstream organ.
handle_trace_chems()
if(!isSynthetic())
handle_trace_chems()
updatehealth()
@@ -920,7 +936,7 @@
if(status_flags & GODMODE) return 0
//SSD check, if a logged player is awake put them back to sleep!
if(species.show_ssd && !client && !teleop)
if(species.get_ssd(src) && !client && !teleop)
Sleeping(2)
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
@@ -928,7 +944,7 @@
else //ALIVE. LIGHTS ARE ON
updatehealth() //TODO
if(health <= config.health_threshold_dead || (species.has_organ["brain"] && !has_brain()))
if(health <= config.health_threshold_dead || (should_have_organ("brain") && !has_brain()))
death()
blinded = 1
silent = 0
@@ -1248,7 +1264,7 @@
if(2) healths.icon_state = "health7"
else
//switch(health - halloss)
switch(100 - ((species.flags & NO_PAIN) ? 0 : traumatic_shock))
switch(100 - (!can_feel_pain() ? 0 : traumatic_shock))
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
@@ -1410,7 +1426,7 @@
// Puke if toxloss is too high
if(!stat)
if (getToxLoss() >= 45 && nutrition > 20)
vomit()
spawn vomit()
//0.1% chance of playing a scary sound to someone who's in complete darkness
if(isturf(loc) && rand(1,1000) == 1)
@@ -1484,7 +1500,7 @@
/mob/living/carbon/human/handle_shock()
..()
if(status_flags & GODMODE) return 0 //godmode
if(species && species.flags & NO_PAIN) return
if(!can_feel_pain()) return
if(health < config.health_threshold_softcrit)// health 0 makes you immediately collapse
shock_stage = max(shock_stage, 61)
@@ -1535,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(species && species.flags & NO_BLOOD)
if(!internal_organs_by_name[O_HEART])
return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
@@ -1566,12 +1582,12 @@
return temp
/mob/living/carbon/human/proc/handle_heartbeat()
if(pulse == PULSE_NONE || !species.has_organ["heart"])
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.robotic >=2 )
if(!H || (H.status & ORGAN_ROBOT))
return
if(pulse >= PULSE_2FAST || shock_stage >= 10 || istype(get_turf(src), /turf/space))
@@ -1734,7 +1750,7 @@
return slurring
/mob/living/carbon/human/handle_stunned()
if(species.flags & NO_PAIN)
if(!can_feel_pain())
stunned = 0
return 0
if(..())

View File

@@ -18,7 +18,7 @@
remains_type = /obj/effect/decal/cleanable/ash
death_message = "dissolves into ash..."
flags = NO_BLOOD | NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT
flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)

View File

@@ -25,7 +25,6 @@
cold_level_2 = 50
cold_level_3 = 0
eyes = "vox_eyes_s"
gluttonous = 2
breath_type = "nitrogen"
@@ -45,14 +44,29 @@
/mob/living/carbon/human/proc/leap
)
has_limbs = list(
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)
@@ -94,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

View File

@@ -19,7 +19,6 @@
var/blood_mask = 'icons/mob/human_races/masks/blood_human.dmi'
var/prone_icon // If set, draws this from icobase when mob is prone.
var/eyes = "eyes_s" // Icon for eyes.
var/blood_color = "#A10808" // Red.
var/flesh_color = "#FFC896" // Pink.
var/base_color // Used by changelings. Should also be used for icon previes..
@@ -59,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"
@@ -85,7 +82,7 @@
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
var/light_dam // If set, mob will be damaged in light over this value and heal in light below its negative.
var/body_temperature = 310.15 // Non-IS_SYNTHETIC species will try to stabilize at this temperature.
var/body_temperature = 310.15 // Species will try to stabilize at this temperature.
// (also affects temperature processing)
var/heat_discomfort_level = 315 // Aesthetic messages about feeling warm.
@@ -121,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
@@ -159,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)
@@ -177,6 +174,24 @@
/datum/species/proc/get_bodytype()
return name
/datum/species/proc/get_knockout_message(var/mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? "encounters a hardware fault and suddenly reboots!" : knockout_message)
/datum/species/proc/get_death_message(var/mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message)
/datum/species/proc/get_ssd(var/mob/living/carbon/human/H)
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()) ? 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()) ? SYNTH_FLESH_COLOUR : flesh_color)
/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type)
if(!prob(5))
@@ -252,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)

View File

@@ -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)

View File

@@ -7,7 +7,7 @@
language = "Sol Common" //todo?
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch)
flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN | NO_POISON | NO_MINOR_CUT
flags = NO_PAIN | NO_SCAN | NO_POISON | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED
siemens_coefficient = 0
@@ -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..."

View File

@@ -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
)
/*

View File

@@ -15,8 +15,6 @@
has_fine_manipulation = 0
show_ssd = null
eyes = "blank_eyes"
gibbed_anim = "gibbed-m"
dusted_anim = "dust-m"
death_message = "lets out a faint chimper as it collapses and stops moving..."
@@ -40,6 +38,20 @@
pass_flags = PASSTABLE
has_limbs = list(
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)
if(H.stat != CONSCIOUS)
return

View File

@@ -8,7 +8,7 @@
language = null //todo?
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
flags = NO_SCAN | NO_SLIP | NO_BREATHE | NO_MINOR_CUT
flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED
siemens_coefficient = 3 //conductive
darksight = 3
@@ -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)

View File

@@ -131,7 +131,6 @@
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
eyes = "skrell_eyes_s"
primitive_form = "Neaera"
unarmed_types = list(/datum/unarmed_attack/punch)
blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
@@ -152,6 +151,20 @@
reagent_tag = IS_SKRELL
has_limbs = list(
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
name = "Diona"
name_plural = "Dionaea"
@@ -164,7 +177,6 @@
rarity_value = 3
hud_type = /datum/hud_data/diona
siemens_coefficient = 0.3
eyes = "blank_eyes"
show_ssd = "completely quiescent"
num_alternate_languages = 1
name_language = "Rootspeak"
@@ -178,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/diona/head),
"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(
@@ -217,7 +229,7 @@
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
flags = NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | NO_MINOR_CUT
flags = NO_SCAN | IS_PLANT | NO_PAIN | NO_SLIP | NO_MINOR_CUT
spawn_flags = CAN_JOIN | IS_WHITELISTED
blood_color = "#004400"
@@ -248,88 +260,14 @@
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)
H.visible_message("<span class='danger'>[H] splits apart with a wet slithering noise!</span>")
/datum/species/machine
name = "Machine"
name_plural = "machines"
blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \
robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \
to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \
generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \
inhuman in outlook and perspective."
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
language = "Encoded Audio Language"
unarmed_types = list(/datum/unarmed_attack/punch)
rarity_value = 2
num_alternate_languages = 1 // potentially could be 2?
name_language = "Encoded Audio Language"
eyes = "blank_eyes"
brute_mod = 1.875 // 100% * 1.875 * 0.8 (robolimbs) ~= 150%
burn_mod = 1.875 // So they take 50% extra damage from brute/burn overall.
show_ssd = "flashing a 'system offline' glyph on their monitor"
death_message = "gives one shrill beep before falling lifeless."
knockout_message = "encounters a hardware fault and suddenly reboots!"
warning_low_pressure = 50
hazard_low_pressure = 0
cold_level_1 = 50
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage
heat_level_2 = 1000
heat_level_3 = 2000
passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment.
flags = NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON
spawn_flags = CAN_JOIN | IS_WHITELISTED
blood_color = "#1F181F"
flesh_color = "#575757"
virus_immune = 1
reagent_tag = IS_MACHINE
has_organ = list(
"brain" = /obj/item/organ/mmi_holder/posibrain,
"cell" = /obj/item/organ/cell,
"optics" = /obj/item/organ/optical_sensor
)
vision_organ = "optics"
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/ipc),
"groin" = list("path" = /obj/item/organ/external/groin/ipc),
"head" = list("path" = /obj/item/organ/external/head/ipc),
"l_arm" = list("path" = /obj/item/organ/external/arm/ipc),
"r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc),
"l_leg" = list("path" = /obj/item/organ/external/leg/ipc),
"r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc),
"l_hand" = list("path" = /obj/item/organ/external/hand/ipc),
"r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc),
"l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
)
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
..()
H.h_style = ""
spawn(100)
if(H) H.update_hair()
/datum/species/machine/sanitize_name(var/name)
return sanitizeName(name, allow_numbers = 1)
H.visible_message("<span class='danger'>\The [H] splits apart with a wet slithering noise!</span>")

View File

@@ -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)

View File

@@ -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))

View File

@@ -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>")

View File

@@ -13,8 +13,6 @@
siemens_coefficient = 0
gluttonous = 3
eyes = "blank_eyes"
brute_mod = 0.5 // Hardened carapace.
burn_mod = 2 // Weak to fire.
@@ -25,7 +23,7 @@
cold_level_2 = -1
cold_level_3 = -1
flags = NO_BREATHE | NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT
flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED
reagent_tag = IS_XENOS
@@ -46,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
@@ -62,6 +60,20 @@
var/weeds_heal_rate = 1 // Health regen on weeds.
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
has_limbs = list(
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()
return "Xenomorph"
@@ -100,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)
..()
@@ -160,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(
@@ -199,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(
@@ -227,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(
@@ -259,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(

View File

@@ -69,7 +69,10 @@
if(stripping)
visible_message("<span class='danger'>\The [user] is trying to remove \the [src]'s [target_slot.name]!</span>")
else
visible_message("<span class='danger'>\The [user] is trying to put \a [held] on \the [src]!</span>")
if(slot_to_strip == slot_wear_mask && istype(held, /obj/item/weapon/grenade))
visible_message("<span class='danger'>\The [user] is trying to put \a [held] in \the [src]'s mouth!</span>")
else
visible_message("<span class='danger'>\The [user] is trying to put \a [held] on \the [src]!</span>")
if(!do_after(user,HUMAN_STRIP_DELAY))
return
@@ -121,7 +124,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)

View File

@@ -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. Plus it doesn't work with NO_PAIN
//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,11 +93,14 @@ 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"]
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>")
target << "<span class='danger'>You experience[(target.species.flags & NO_PAIN)? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(target.species.flags & NO_PAIN)? "." : "!"]</span>"
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>")
var/eye_pain = eyes.can_feel_pain()
target << "<span class='danger'>You experience[(eye_pain) ? "" : " immense pain as you feel" ] [eye_attack_text_victim] being pressed into your [eyes.name][(eye_pain)? "." : "!"]</span>"
return
user.visible_message("<span class='danger'>[user] attempts to press \his [eye_attack_text] into [target]'s eyes, but they don't have any!</span>")
/datum/unarmed_attack/bite
attack_verb = list("bit")
@@ -109,9 +112,9 @@ var/global/list/sparring_attack_cache = list()
/datum/unarmed_attack/bite/is_usable(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone)
if (user.wear_mask && istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
if (user.is_muzzled())
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
@@ -134,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)
@@ -174,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"]

View File

@@ -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]/[species.blood_color]/[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(species.blood_color, 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)
@@ -786,7 +788,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_inv_wear_mask(var/update_icons=1)
if( wear_mask && ( istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory) ) && !(head && head.flags_inv & HIDEMASK))
if( wear_mask && ( istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory) || istype(wear_mask, /obj/item/weapon/grenade) ) && !(head && head.flags_inv & HIDEMASK))
wear_mask.screen_loc = ui_mask //TODO
var/image/standing

View File

@@ -37,7 +37,7 @@
//This is used by both the whisper verb and human/say() to handle whispering
/mob/living/carbon/human/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers")
if (istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
if (is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"
return

View File

@@ -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)

View File

@@ -63,7 +63,7 @@
H.custom_pain(painMes)
else if (istype(M, /mob/living/carbon))
var/mob/living/carbon/C = M
if (!(C.species && (C.species.flags & NO_PAIN)))
if (C.can_feel_pain())
M << "<span class='danger'>[painMes]</span>"
gain_nutrition(rand(20,25))

View File

@@ -3,7 +3,7 @@
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/proc/updateshock()
if (species && (species.flags & NO_PAIN))
if (!can_feel_pain())
src.traumatic_shock = 0
return 0

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
@@ -813,3 +813,51 @@ default behaviour is:
ear_damage = damage
if(deaf >= 0)
ear_deaf = deaf
/mob/living/proc/vomit(var/skip_wait, var/blood_vomit)
if(isSynthetic())
src << "<span class='danger'>A sudden, dizzying wave of internal feedback rushes over you!</span>"
src.Weaken(5)
return
if(!check_has_mouth())
return
if(!lastpuke)
if (nutrition <= 100)
src << "<span class='danger'>You gag as you want to throw up, but there's nothing in your stomach!</span>"
src.Weaken(10)
src.adjustToxLoss(3)
return
lastpuke = 1
src << "<span class='warning'>You feel nauseous...</span>"
if(!skip_wait)
sleep(150) //15 seconds until second warning
src << "<span class='warning'>You feel like you are about to throw up!</span>"
sleep(100) //and you have 10 more for mad dash to the bucket
Stun(5)
src.visible_message("<span class='warning'>[src] throws up!</span>","<span class='warning'>You throw up!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/simulated/T = get_turf(src)
if(istype(T))
if(blood_vomit)
T.add_blood_floor(src)
else
T.add_vomit_floor(src, 1)
if(blood_vomit)
if(getBruteLoss() < 50)
adjustBruteLoss(3)
else
nutrition -= 40
adjustToxLoss(-3)
sleep(350)
lastpuke = 0

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

View File

@@ -43,3 +43,4 @@
var/fire_stacks
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/lastpuke = 0

View File

@@ -82,9 +82,6 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/proc/get_default_language()
return default_language
/mob/living/proc/is_muzzled()
return 0
/mob/living/proc/handle_speech_problems(var/message, var/verb)
var/list/returns[3]
var/speech_problem_flag = 0
@@ -167,7 +164,7 @@ proc/get_radio_key_from_channel(var/channel)
speaking.broadcast(src,trim(message))
return 1
verb = say_quote(message, speaking)
verb = say_quote(message, speaking)
if(is_muzzled())
src << "<span class='danger'>You're muzzled and cannot speak!</span>"

View File

@@ -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)

View File

@@ -30,7 +30,7 @@ var/list/mob_hat_cache = list()
universal_understand = 1
gender = NEUTER
pass_flags = PASSTABLE
braintype = "Robot"
braintype = "Drone"
lawupdate = 0
density = 1
req_access = list(access_engine, access_robotics)

View File

@@ -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,

View File

@@ -247,7 +247,7 @@
if((crisis && security_level == SEC_LEVEL_RED) || crisis_override) //Leaving this in until it's balanced appropriately.
src << "\red Crisis mode active. Combat module available."
modules+="Combat"
modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules
modtype = input("Please, select a module!", "Robot module", null, null) as null|anything in modules
if(module)
return
@@ -267,9 +267,9 @@
modtype = prefix
if(istype(mmi, /obj/item/device/mmi/digital/posibrain))
braintype = "Android"
else if(istype(mmi, /obj/item/device/mmi/digital/robot))
braintype = "Robot"
else if(istype(mmi, /obj/item/device/mmi/digital/robot))
braintype = "Drone"
else
braintype = "Cyborg"
@@ -911,7 +911,7 @@
if(!(icontype in module_sprites))
icontype = module_sprites[1]
else
icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot", icontype, null) in module_sprites
icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chance\s." : "This is your last try."]", "Robot Icon", icontype, null) in module_sprites
icon_state = module_sprites[icontype]
updateicon()

View File

@@ -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

View File

@@ -73,11 +73,11 @@
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!"
if(!H.species.has_organ["brain"])
if(!H.should_have_organ("brain"))
src << "\The [H] does not seem to have an ear canal to breach."
return
@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -406,8 +406,8 @@
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
if (deathtime < 18000)
usr << "You must wait 30 minutes to respawn!"
if (deathtime < (15 * 600))
usr << "You must wait 15 minutes to respawn!"
return
else
usr << "You can respawn now, enjoy your new life!"
@@ -1128,3 +1128,10 @@ 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
/mob/proc/is_muzzled()
return 0

View File

@@ -87,7 +87,6 @@
var/canmove = 1
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
var/lastpuke = 0
var/unacidable = 0
var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm)
var/list/embedded = list() // Embedded items, since simple mobs don't have organs.

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

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,13 +93,13 @@
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.knockout_message]</span>")
target.visible_message("<span class='danger'>[target] [target.species.get_knockout_message(target)]</span>")
playsound(attacker.loc, "swing_hit", 25, 1, -1)
attacker.attack_log += text("\[[time_stamp()]\] <font color='red'>Headbutted [target.name] ([target.ckey])</font>")

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,
)

View File

@@ -3,8 +3,18 @@ datum/preferences
proc/randomize_appearance_for(var/mob/living/carbon/human/H)
gender = pick(MALE, FEMALE)
s_tone = random_skin_tone()
h_style = random_hair_style(gender, species)
f_style = random_facial_hair_style(gender, species)
var/use_head_species
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
use_head_species = H.species.get_bodytype()
if(use_head_species)
h_style = random_hair_style(gender, species)
f_style = random_facial_hair_style(gender, species)
randomize_hair_color("hair")
randomize_hair_color("facial")
randomize_eyes_color()
@@ -191,37 +201,58 @@ datum/preferences
else
icobase = 'icons/mob/human_races/r_human.dmi'
preview_icon = new /icon(icobase, "torso_[g]")
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand"))
if(organ_data[name] == "amputated") continue
preview_icon = new /icon(icobase, "")
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
preview_icon.Blend(icon(R.icon, "[name]"), ICON_OVERLAY) // This doesn't check gendered_icon. Not an issue while only limbs can be robotic.
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
preview_icon.Blend(new /icon(icobase, "[name]"), ICON_OVERLAY)
var/icon/limb_icon
if(name in list(BP_TORSO, BP_GROIN, BP_HEAD))
limb_icon = new /icon(icobase, "[name]_[g]")
else
limb_icon = new /icon(icobase, "[name]")
// Skin color
if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR))
limb_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
// Skin tone
if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE))
if (s_tone >= 0)
limb_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
limb_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
preview_icon.Blend(limb_icon, ICON_OVERLAY)
//Tail
if(current_species && (current_species.tail))
var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s")
if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR))
temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE))
if (s_tone >= 0)
temp.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
temp.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
preview_icon.Blend(temp, ICON_OVERLAY)
// Skin color
if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR))
preview_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
// 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[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 ()
if(istype(temp_head))
use_eye_icon = temp_head.eye_icon
qdel(temp_head)
// Skin tone
if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE))
if (s_tone >= 0)
preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = use_eye_icon)
if ((current_species && (current_species.appearance_flags & HAS_EYE_COLOR)))
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)

View File

@@ -145,9 +145,9 @@
O.loc = loc
O.job = "Cyborg"
if(O.mind.assigned_role == "Cyborg")
if(O.mind.role_alt_title == "Android")
if(O.mind.role_alt_title == "Robot")
O.mmi = new /obj/item/device/mmi/digital/posibrain(O)
else if(O.mind.role_alt_title == "Robot")
else if(O.mind.role_alt_title == "Drone")
O.mmi = new /obj/item/device/mmi/digital/robot(O)
else
O.mmi = new /obj/item/device/mmi(O)

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()

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(O_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(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 && species.has_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
@@ -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(O_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(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(species.flags & NO_BLOOD)
if(should_have_organ(O_HEART))
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return

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,28 +43,19 @@
qdel(src)
//VOX ORGANS.
/obj/item/organ/stack
/obj/item/organ/internal/stack
name = "cortical stack"
parent_organ = "head"
robotic = 2
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
/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
/obj/item/organ/internal/stack/vox/stack
name = "vox cortical stack"

View File

@@ -3,45 +3,39 @@ var/list/organ_cache = list()
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
var/dead_icon
var/mob/living/carbon/human/owner = null
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?
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
// Strings.
var/organ_tag = "organ" // Unique identifier.
var/parent_organ = BP_TORSO // Organ holding this object.
// Status tracking.
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 // 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 // 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
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 ..()
@@ -88,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()
@@ -111,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)
@@ -189,8 +181,18 @@ 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/remove_rejuv()
qdel(src)
/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/is_damaged()
return damage > 0
@@ -241,19 +243,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,25 +316,13 @@ 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)
// 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(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 +345,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 == I_HELP && user.zone_sel.selecting == O_MOUTH)
bitten(user)
return
/obj/item/organ/proc/can_feel_pain()
return !(status & (ORGAN_ROBOT|ORGAN_DESTROYED)) && !(species.flags & NO_PAIN)

View File

@@ -14,51 +14,61 @@
dir = SOUTH
organ_tag = "limb"
var/brute_mod = 1
var/burn_mod = 1
// Strings
var/broken_description // fracture string if any.
var/damage_state = "00" // Modifier used for generating the on-mob damage overlay for this limb.
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/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
// Damage vars.
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 // 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() // 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 // 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
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
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
/obj/item/organ/external/Destroy()
if(parent && parent.children)
parent.children -= src
@@ -70,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)
@@ -175,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
@@ -188,12 +205,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 +230,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,12 +327,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
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()
@@ -333,13 +338,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 +350,40 @@ 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[organ_tag]
if(status == "amputated")
remove_rejuv()
else if(status == "cyborg")
var/robodata = owner.client.prefs.rlimb_data[organ_tag]
if(robodata)
robotize(robodata)
else
robotize()
owner.updatehealth()
/obj/item/organ/external/remove_rejuv()
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
if(children && children.len)
for(var/obj/item/organ/external/E in children)
E.remove_rejuv()
children.Cut()
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
@@ -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(O_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(O_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 /obj/effect/decal/cleanable/blood/gibs(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))
@@ -877,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
@@ -891,26 +919,63 @@ 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/skip_prosthetics = 0, var/keep_organs = 0)
if(status & ORGAN_ROBOT)
return
if(status & ORGAN_ROBOT)
return
..()
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
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.
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
return 1
/obj/item/organ/external/proc/mutate()
if(src.status & ORGAN_ROBOT)
@@ -923,7 +988,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)
@@ -990,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)
@@ -1012,13 +1077,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()
@@ -1083,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
@@ -1097,37 +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/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
@@ -1135,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
@@ -1143,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
@@ -1158,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
@@ -1169,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
@@ -1185,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
@@ -1195,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
@@ -1210,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
@@ -1218,11 +1296,18 @@ 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)
@@ -1244,3 +1329,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)

Some files were not shown because too many files have changed in this diff Show More