Merge branch 'virgoMaster' into virgoPull

This commit is contained in:
Reddeyfish
2018-03-21 21:22:51 -07:00
422 changed files with 25092 additions and 549605 deletions
-2
View File
@@ -27,8 +27,6 @@ var/const/CE_STABLE_THRESHOLD = 0.5
return
vessel.add_reagent("blood",species.blood_volume)
spawn(1)
fixblood()
//Resets blood data
/mob/living/carbon/human/proc/fixblood()
+30 -17
View File
@@ -52,7 +52,7 @@ var/list/organ_cache = list()
if(istype(holder))
src.owner = holder
src.w_class = max(src.w_class + mob_size_difference(holder.mob_size, MOB_MEDIUM), 1) //smaller mobs have smaller organs.
species = all_species["Human"]
species = all_species[SPECIES_HUMAN]
if(holder.dna)
dna = holder.dna.Clone()
species = holder.species //VOREStation Edit - For custom species
@@ -142,6 +142,7 @@ var/list/organ_cache = list()
if(status & ORGAN_DEAD)
user << "<span class='notice'>The decay has set in.</span>"
//A little wonky: internal organs stop calling this (they return early in process) when dead, but external ones cause further damage when dead
/obj/item/organ/proc/handle_germ_effects()
//** Handle the effects of infections
if(robotic >= ORGAN_ROBOT) //Just in case!
@@ -152,11 +153,14 @@ var/list/organ_cache = list()
var/infection_damage = 0
if((status & ORGAN_DEAD) && antibiotics < ANTIBIO_OD) //Sepsis from 'dead' organs
infection_damage = min(1, 1 + round((germ_level - INFECTION_LEVEL_THREE)/200,0.25)) //1 Tox plus a little based on germ level
/// Infection damage
//If the organ is dead, for the sake of organs that may have died due to non-infection, we'll only do damage if they have at least L1 infection (built up below)
if((status & ORGAN_DEAD) && antibiotics < ANTIBIO_OD && germ_level >= INFECTION_LEVEL_ONE)
infection_damage = max(1, 1 + round((germ_level - INFECTION_LEVEL_THREE)/200,0.25)) //1 Tox plus a little based on germ level
else if(germ_level > INFECTION_LEVEL_TWO && antibiotics < ANTIBIO_OD)
infection_damage = min(0.25, 0.25 + round((germ_level - INFECTION_LEVEL_TWO)/200,0.25))
infection_damage = max(0.25, 0.25 + round((germ_level - INFECTION_LEVEL_TWO)/200,0.25))
if(infection_damage)
owner.adjustToxLoss(infection_damage)
@@ -164,23 +168,31 @@ var/list/organ_cache = list()
if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
adjust_germ_level(-antibiotics)
/// Germ Accumulation
//Dead organs accumulate germs indefinitely
if(status & ORGAN_DEAD)
adjust_germ_level(1)
//Half of level 1 is growing but harmless
if (germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(!antibiotics && prob(round(germ_level/6)))
adjust_germ_level(1)
//Level 1 qualifies for specific organ processing effects
if(germ_level >= INFECTION_LEVEL_ONE)
. = 1 //Organ qualifies for effect-specific processing
//var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature
//owner.bodytemperature += between(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature)
. = 1
var/fever_temperature = owner.species.heat_discomfort_level * 1.10 //Heat discomfort level plus 10%
if(owner.bodytemperature < fever_temperature)
owner.bodytemperature += min(0.2,(fever_temperature - owner.bodytemperature) / 10) //Will usually climb by 0.2, else 10% of the difference if less
//Level two qualifies for further processing effects
if (germ_level >= INFECTION_LEVEL_TWO)
. = 2 //Organ qualifies for effect-specific processing
//No particular effect on the general 'organ' at 3
//Level three qualifies for significant growth and further effects
if (germ_level >= INFECTION_LEVEL_THREE && antibiotics < ANTIBIO_OD)
. = 3 //Organ qualifies for effect-specific processing
adjust_germ_level(rand(5,10)) //Germ_level increases without overdose of antibiotics
@@ -294,15 +306,16 @@ var/list/organ_cache = list()
/obj/item/organ/emp_act(severity)
if(!(robotic >= ORGAN_ASSISTED))
return
switch (severity)
if (1)
take_damage(rand(6,12))
if (2)
take_damage(rand(4,8))
if (3)
take_damage(rand(3,6))
if (4)
take_damage(rand(1,4))
for(var/i = 1; i <= robotic; i++)
switch (severity)
if (1)
take_damage(rand(5,9))
if (2)
take_damage(rand(3,7))
if (3)
take_damage(rand(2,5))
if (4)
take_damage(rand(1,3))
/obj/item/organ/proc/removed(var/mob/living/user)
@@ -317,7 +330,7 @@ var/list/organ_cache = list()
var/obj/item/organ/external/affected = owner.get_organ(parent_organ)
if(affected) affected.internal_organs -= src
loc = get_turf(owner)
loc = owner.drop_location()
processing_objects |= src
rejecting = null
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
+38 -23
View File
@@ -107,15 +107,16 @@
if(!(robotic >= ORGAN_ROBOT))
return
var/burn_damage = 0
switch (severity)
if (1)
burn_damage += rand(8, 13)
if (2)
burn_damage += rand(6, 9)
if(3)
burn_damage += rand(4, 7)
if(4)
burn_damage += rand(1, 5)
for(var/i = 1; i <= robotic; i++)
switch (severity)
if (1)
burn_damage += rand(5, 8)
if (2)
burn_damage += rand(4, 6)
if(3)
burn_damage += rand(2, 5)
if(4)
burn_damage += rand(1, 3)
if(burn_damage)
take_damage(0, burn_damage)
@@ -213,8 +214,6 @@
/obj/item/organ/external/update_health()
damage = min(max_damage, (brute_dam + burn_dam))
return
/obj/item/organ/external/New(var/mob/living/carbon/holder)
..(holder, 0)
@@ -271,7 +270,7 @@
if(status & ORGAN_BROKEN && brute)
jostle_bone(brute)
if(organ_can_feel_pain() && prob(40))
if(organ_can_feel_pain() && prob(40) && !isbelly(owner.loc)) //VOREStation Edit
owner.emote("scream") //getting hit on broken hand hurts
if(used_weapon)
add_autopsy_data("[used_weapon]", brute + burn)
@@ -400,7 +399,7 @@
user << "<span class='notice'>Nothing to fix!</span>"
return 0
if(damage_amount >= min_broken_damage) //VOREStation Edit - Makes robotic limb damage scalable
if(brute_dam + burn_dam >= min_broken_damage) //VOREStation Edit - Makes robotic limb damage scalable
user << "<span class='danger'>The damage is far too severe to patch over externally.</span>"
return 0
@@ -775,6 +774,8 @@ Note that amputating the affected organ does in fact remove the infection from t
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(robotic >= ORGAN_ROBOT))
src.fracture()
update_health()
// new damage icon system
// adjusted to set damage_state to brute/burn code only (without r_name0 as before)
/obj/item/organ/external/update_icon()
@@ -810,6 +811,17 @@ Note that amputating the affected organ does in fact remove the infection from t
tbrute = 3
return "[tbrute][tburn]"
/obj/item/organ/external/take_damage()
..()
if(!cannot_amputate)
if(nonsolid && damage >= max_damage)
droplimb(TRUE, DROPLIMB_EDGE)
//VOREStation Add Start
if(robotic >= ORGAN_NANOFORM && damage >= max_damage)
droplimb(TRUE, DROPLIMB_BURN)
//VOREStation Add End
/****************************************************
DISMEMBERMENT
****************************************************/
@@ -819,8 +831,10 @@ Note that amputating the affected organ does in fact remove the infection from t
if(cannot_amputate || !owner)
return
if(disintegrate == DROPLIMB_EDGE && nonsolid)
//VOREStation Add
if(robotic >= ORGAN_NANOFORM)
disintegrate = DROPLIMB_BURN //Ashes will be fine
else if(disintegrate == DROPLIMB_EDGE && nonsolid) //VOREStation Add End
disintegrate = DROPLIMB_BLUNT //splut
switch(disintegrate)
@@ -874,9 +888,10 @@ Note that amputating the affected organ does in fact remove the infection from t
spawn(1)
victim.updatehealth()
victim.UpdateDamageIcon()
victim.regenerate_icons()
victim.update_icons_body()
dir = 2
var/atom/droploc = victim.drop_location()
switch(disintegrate)
if(DROPLIMB_EDGE)
appearance_flags &= ~PIXEL_SCALE
@@ -891,17 +906,17 @@ Note that amputating the affected organ does in fact remove the infection from t
throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
dir = 2
if(DROPLIMB_BURN)
new /obj/effect/decal/cleanable/ash(get_turf(victim))
new /obj/effect/decal/cleanable/ash(droploc)
for(var/obj/item/I in src)
if(I.w_class > ITEMSIZE_SMALL && !istype(I,/obj/item/organ))
I.loc = get_turf(src)
I.forceMove(droploc)
qdel(src)
if(DROPLIMB_BLUNT)
var/obj/effect/decal/cleanable/blood/gibs/gore
if(robotic >= ORGAN_ROBOT)
gore = new /obj/effect/decal/cleanable/blood/gibs/robot(get_turf(victim))
gore = new /obj/effect/decal/cleanable/blood/gibs/robot(droploc)
else
gore = new /obj/effect/decal/cleanable/blood/gibs(get_turf(victim))
gore = new /obj/effect/decal/cleanable/blood/gibs(droploc)
if(species)
gore.fleshcolor = use_flesh_colour
gore.basecolor = use_blood_colour
@@ -918,7 +933,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(I.w_class <= ITEMSIZE_SMALL)
qdel(I)
continue
I.loc = get_turf(src)
I.forceMove(droploc)
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),5)
qdel(src)
@@ -1016,7 +1031,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"<span class='danger'>Something feels like it shattered in your [name]!</span>",\
"<span class='danger'>You hear a sickening crack.</span>")
jostle_bone()
if(organ_can_feel_pain())
if(organ_can_feel_pain() && !isbelly(owner.loc))
owner.emote("scream")
playsound(src.loc, "fracture", 10, 1, -2)
@@ -1091,7 +1106,7 @@ Note that amputating the affected organ does in fact remove the infection from t
unmutate()
for(var/obj/item/organ/external/T in children)
T.robotize(company, 1)
T.robotize(company, keep_organs = keep_organs)
if(owner)
+15
View File
@@ -0,0 +1,15 @@
//Sideways override for nanoform limbs (ugh)
/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE)
var/original_robotic = robotic
if(original_robotic >= ORGAN_NANOFORM)
var/o_encased = encased
var/o_max_damage = max_damage
var/o_min_broken_damage = min_broken_damage
robotic = FALSE
. = ..(company = company, keep_organs = TRUE)
robotic = original_robotic
encased = o_encased
max_damage = o_max_damage
min_broken_damage = o_min_broken_damage
else
return ..()
+31 -15
View File
@@ -50,44 +50,60 @@ var/global/list/limb_icon_cache = list()
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/get_icon()
..()
overlays.Cut()
//The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item
cut_overlays()
//Every 'addon' below requires information from species
if(!owner || !owner.species)
return
if(owner.should_have_organ(O_EYES))
//Eye color/icon
var/should_have_eyes = owner.should_have_organ(O_EYES)
var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR
if((should_have_eyes || has_eye_color) && eye_icon)
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eye_icon)
var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon)
var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon)
//Should have eyes
if(should_have_eyes)
//And we have them
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
//They're gone!
else
eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
//We have weird other-sorts of eyes (as we're not supposed to have eye organ, but we have HAS_EYE_COLOR species)
else
eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD)
add_overlay(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
//Lip color/icon
if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS)))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
overlays |= lip_icon
add_overlay(lip_icon)
mob_icon.Blend(lip_icon, ICON_OVERLAY)
//Head markings.
//Head markings
for(var/M in markings)
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
overlays |= mark_s //So when it's not on your body, it has icons
add_overlay(mark_s) //So when it's not on your body, it has icons
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
icon_cache_key += "[M][markings[M]["color"]]"
//Facial hair
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_MULTIPLY) // VOREStation edit
overlays |= facial_s
add_overlay(facial_s)
//Head hair
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style]
if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed))
@@ -96,7 +112,7 @@ var/global/list/limb_icon_cache = list()
if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3)
hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY)
hair_s.Blend(hair_s_add, ICON_ADD)
overlays |= hair_s
add_overlay(hair_s)
return mob_icon
@@ -106,7 +122,7 @@ var/global/list/limb_icon_cache = list()
if(owner && owner.gender == MALE)
gender = "m"
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : "Human"]" //VOREStation Edit
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
@@ -179,7 +195,7 @@ var/global/list/limb_icon_cache = list()
if(nonsolid)
applying.MapColors("#4D4D4D","#969696","#1C1C1C", "#000000")
if(species && species.get_bodytype(owner) != "Human")
if(species && species.get_bodytype(owner) != SPECIES_HUMAN)
applying.SetIntensity(1) // Unathi, Taj and Skrell have -very- dark base icons. VOREStation edit fixes this and brings the number back to 1
else
applying.SetIntensity(1) //VOREStation edit to make Prometheans not look like shit with mob coloring.
+1 -1
View File
@@ -42,7 +42,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
var/lifelike // If set, appears organic.
var/skin_tone // If set, applies skin tone rather than part color
var/blood_color = "#030303"
var/list/species_cannot_use = list("Teshari")
var/list/species_cannot_use = list(SPECIES_TESHARI, "Promethean") //VOREStation Add
var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors.
var/parts = BP_ALL //Defines what parts said brand can replace on a body.
var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator.
+139
View File
@@ -0,0 +1,139 @@
// // // External Organs
/obj/item/organ/external/chest/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 50 // <-- This is different from the rest
min_broken_damage = 1000
vital = TRUE // <-- This is different from the rest
/obj/item/organ/external/groin/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 30 // <-- This is different from the rest
min_broken_damage = 1000 //Multiple
vital = FALSE
/obj/item/organ/external/head/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000 //Inheritance
vital = FALSE
/obj/item/organ/external/arm/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000 //Please
vital = FALSE
/obj/item/organ/external/arm/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
/obj/item/organ/external/leg/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
/obj/item/organ/external/leg/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
/obj/item/organ/external/hand/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
/obj/item/organ/external/hand/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
/obj/item/organ/external/foot/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
/obj/item/organ/external/foot/right/unbreakable/nano
robotic = ORGAN_NANOFORM
encased = FALSE
max_damage = 10
min_broken_damage = 1000
vital = FALSE
// // // Internal Organs
/obj/item/organ/internal/nano
robotic = ORGAN_ROBOT
/obj/item/organ/internal/nano/orchestrator
name = "orchestrator module"
desc = "A small computer, designed for highly parallel workloads."
icon = 'icons/mob/species/protean/protean.dmi'
icon_state = "orchestrator"
organ_tag = O_ORCH
parent_organ = BP_TORSO
vital = TRUE
/obj/item/organ/internal/nano/refactory
name = "refactory module"
desc = "A miniature metal processing unit and nanite factory."
icon = 'icons/mob/species/protean/protean.dmi'
icon_state = "refactory"
organ_tag = O_FACT
parent_organ = BP_TORSO
var/list/materials = list(DEFAULT_WALL_MATERIAL = 0)
var/max_storage = 10000
/obj/item/organ/internal/nano/refactory/proc/get_stored_material(var/material)
if(status & ORGAN_DEAD)
return 0
return materials[material] || 0
/obj/item/organ/internal/nano/refactory/proc/add_stored_material(var/material,var/amt)
if(status & ORGAN_DEAD)
return 0
var/increase = min(amt,max(max_storage-materials[material],0))
if(isnum(materials[material]))
materials[material] += increase
else
materials[material] = increase
return increase
/obj/item/organ/internal/nano/refactory/proc/use_stored_material(var/material,var/amt)
if(status & ORGAN_DEAD)
return 0
var/available = materials[material]
//Success
if(available >= amt)
var/new_amt = available-amt
if(new_amt == 0)
materials -= material
else
materials[material] = new_amt
return amt
//Failure
return 0
/obj/item/organ/internal/mmi_holder/posibrain/nano
name = "protean posibrain"
desc = "A more advanced version of the standard posibrain, typically found in protean bodies."
icon = 'icons/mob/species/protean/protean.dmi'
icon_state = "posi"
parent_organ = BP_TORSO
/obj/item/organ/internal/mmi_holder/posibrain/nano/update_from_mmi()
..()
icon = initial(icon)
icon_state = "posi1"
stored_mmi.brainmob.languages = owner.languages
+2 -2
View File
@@ -23,8 +23,8 @@
organ_rel_size = 70
base_miss_chance = 10
/obj/item/organ/external/chest/robotize()
if(..())
/obj/item/organ/external/chest/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
if(..() && robotic != ORGAN_NANOFORM) //VOREStation Edit
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)