[MIRROR] Extensive surgery additions (#5590)
* Extensive surgery additions * Update role_preferences.dm * Update surgery_step.dm
This commit is contained in:
committed by
Poojawa
parent
d8faf15832
commit
1e65c813f0
@@ -98,6 +98,7 @@
|
||||
add_splatter_floor(src.loc, 1)
|
||||
|
||||
/mob/living/carbon/human/bleed(amt)
|
||||
amt *= physiology.bleed_mod
|
||||
if(!(NOBLOOD in dna.species.species_traits))
|
||||
..()
|
||||
|
||||
|
||||
@@ -179,27 +179,28 @@
|
||||
|
||||
////////////////////////////////////TRAUMAS////////////////////////////////////////
|
||||
|
||||
/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE)
|
||||
/obj/item/organ/brain/proc/has_trauma_type(brain_trauma_type, resilience = TRAUMA_RESILIENCE_ABSOLUTE)
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/BT = X
|
||||
if(istype(BT, brain_trauma_type) && (consider_permanent || !BT.permanent))
|
||||
if(istype(BT, brain_trauma_type) && (BT.resilience <= resilience))
|
||||
return BT
|
||||
|
||||
|
||||
//Add a specific trauma
|
||||
/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments)
|
||||
/obj/item/organ/brain/proc/gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments)
|
||||
var/trauma_type
|
||||
if(ispath(trauma))
|
||||
trauma_type = trauma
|
||||
SSblackbox.record_feedback("tally", "traumas", 1, trauma_type)
|
||||
traumas += new trauma_type(arglist(list(src, permanent) + arguments))
|
||||
traumas += new trauma_type(arglist(list(src, resilience) + arguments))
|
||||
else
|
||||
SSblackbox.record_feedback("tally", "traumas", 1, trauma.type)
|
||||
traumas += trauma
|
||||
trauma.permanent = permanent
|
||||
if(resilience)
|
||||
trauma.resilience = resilience
|
||||
|
||||
//Add a random trauma of a certain subtype
|
||||
/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE)
|
||||
/obj/item/organ/brain/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience)
|
||||
var/list/datum/brain_trauma/possible_traumas = list()
|
||||
for(var/T in subtypesof(brain_trauma_type))
|
||||
var/datum/brain_trauma/BT = T
|
||||
@@ -208,16 +209,16 @@
|
||||
|
||||
var/trauma_type = pick(possible_traumas)
|
||||
SSblackbox.record_feedback("tally", "traumas", 1, trauma_type)
|
||||
traumas += new trauma_type(src, permanent)
|
||||
traumas += new trauma_type(src, resilience)
|
||||
|
||||
//Cure a random trauma of a certain subtype
|
||||
/obj/item/organ/brain/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE)
|
||||
var/datum/brain_trauma/trauma = has_trauma_type(brain_trauma_type)
|
||||
if(trauma && (cure_permanent || !trauma.permanent))
|
||||
//Cure a random trauma of a certain resilience level
|
||||
/obj/item/organ/brain/proc/cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
|
||||
var/datum/brain_trauma/trauma = has_trauma_type(resilience)
|
||||
if(trauma)
|
||||
qdel(trauma)
|
||||
|
||||
/obj/item/organ/brain/proc/cure_all_traumas(cure_permanent = FALSE)
|
||||
/obj/item/organ/brain/proc/cure_all_traumas(resilience = TRAUMA_RESILIENCE_BASIC)
|
||||
for(var/X in traumas)
|
||||
var/datum/brain_trauma/trauma = X
|
||||
if(cure_permanent || !trauma.permanent)
|
||||
if(trauma.resilience <= resilience)
|
||||
qdel(trauma)
|
||||
|
||||
@@ -746,16 +746,16 @@
|
||||
update_inv_handcuffed()
|
||||
update_hud_handcuffed()
|
||||
|
||||
/mob/living/carbon/fully_heal(admin_revive = 0)
|
||||
/mob/living/carbon/fully_heal(admin_revive = FALSE)
|
||||
if(reagents)
|
||||
reagents.clear_reagents()
|
||||
var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain)
|
||||
if(B)
|
||||
B.damaged_brain = 0
|
||||
B.damaged_brain = FALSE
|
||||
for(var/thing in viruses)
|
||||
var/datum/disease/D = thing
|
||||
if(D.severity != VIRUS_SEVERITY_POSITIVE)
|
||||
D.cure(0)
|
||||
D.cure(FALSE)
|
||||
if(admin_revive)
|
||||
regenerate_limbs()
|
||||
regenerate_organs()
|
||||
@@ -765,7 +765,7 @@
|
||||
update_handcuffed()
|
||||
if(reagents)
|
||||
reagents.addiction_list = list()
|
||||
cure_all_traumas(TRUE, TRUE)
|
||||
cure_all_traumas(TRUE, TRAUMA_RESILIENCE_MAGIC)
|
||||
..()
|
||||
// heal ears after healing traits, since ears check TRAIT_DEAF trait
|
||||
// when healing.
|
||||
|
||||
@@ -121,9 +121,9 @@
|
||||
ContactContractDisease(D)
|
||||
|
||||
if(lying && surgeries.len)
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)
|
||||
for(var/datum/surgery/S in surgeries)
|
||||
if(S.next_step(user))
|
||||
if(S.next_step(user, user.a_intent))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
//initialise organs
|
||||
create_internal_organs() //most of it is done in set_species now, this is only for parent call
|
||||
physiology = new()
|
||||
|
||||
handcrafting = new()
|
||||
|
||||
@@ -29,6 +30,10 @@
|
||||
|
||||
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
|
||||
|
||||
/mob/living/carbon/human/Destroy()
|
||||
QDEL_NULL(physiology)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/OpenCraftingMenu()
|
||||
handcrafting.ui_interact(src)
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
var/obj/item/clothing/C = bp
|
||||
if(C.body_parts_covered & def_zone.body_part)
|
||||
protection += C.armor.getRating(d_type)
|
||||
protection += physiology.armor.getRating(d_type)
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/on_hit(obj/item/projectile/P)
|
||||
@@ -458,6 +459,7 @@
|
||||
heart.beating = TRUE
|
||||
if(stat == CONSCIOUS)
|
||||
to_chat(src, "<span class='notice'>You feel your heart beating again!</span>")
|
||||
siemens_coeff *= physiology.siemens_coeff
|
||||
. = ..(shock_damage,source,siemens_coeff,safety,override,tesla_shock, illusion, stun)
|
||||
if(.)
|
||||
electrocution_animation(40)
|
||||
|
||||
@@ -45,6 +45,9 @@
|
||||
|
||||
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
|
||||
var/datum/personal_crafting/handcrafting
|
||||
var/datum/physiology/physiology
|
||||
|
||||
var/list/datum/bioware = list()
|
||||
|
||||
var/creamed = FALSE //to use with creampie overlays
|
||||
var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot))
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
//Stores several modifiers in a way that isn't cleared by changing species
|
||||
|
||||
/datum/physiology
|
||||
var/brute_mod = 1 // % of brute damage taken from all sources
|
||||
var/burn_mod = 1 // % of burn damage taken from all sources
|
||||
var/tox_mod = 1 // % of toxin damage taken from all sources
|
||||
var/oxy_mod = 1 // % of oxygen damage taken from all sources
|
||||
var/clone_mod = 1 // % of clone damage taken from all sources
|
||||
var/stamina_mod = 1 // % of stamina damage taken from all sources
|
||||
var/brain_mod = 1 // % of brain damage taken from all sources
|
||||
|
||||
var/pressure_mod = 1// % of brute damage taken from low or high pressure (stacks with brute_mod)
|
||||
var/heat_mod = 1 // % of burn damage taken from heat (stacks with burn_mod)
|
||||
var/cold_mod = 1 // % of burn damage taken from cold (stacks with burn_mod)
|
||||
|
||||
var/damage_resistance = 0 // %damage reduction from all sources
|
||||
|
||||
var/siemens_coeff = 1 // resistance to shocks
|
||||
|
||||
var/stun_mod = 1 // % stun modifier
|
||||
var/bleed_mod = 1 // % bleeding modifier
|
||||
var/datum/armor/armor // internal armor datum
|
||||
|
||||
var/speed_mod = 0 //tick modifier for each step. Positive is slower, negative is faster.
|
||||
|
||||
/datum/physiology/New()
|
||||
armor = new
|
||||
@@ -1213,19 +1213,20 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(H.movement_type & FLYING)
|
||||
flight = 1
|
||||
|
||||
if(!flightpack) //Check for chemicals and innate speedups and slowdowns if we're moving using our body and not a flying suit
|
||||
if(H.has_gravity())
|
||||
gravity = TRUE
|
||||
|
||||
if(!flightpack && gravity) //Check for chemicals and innate speedups and slowdowns if we're moving using our body and not a flying suit
|
||||
if(H.has_trait(TRAIT_GOTTAGOFAST))
|
||||
. -= 1
|
||||
if(H.has_trait(TRAIT_GOTTAGOREALLYFAST))
|
||||
. -= 2
|
||||
. += speedmod
|
||||
. += H.physiology.speed_mod
|
||||
|
||||
if(H.has_trait(TRAIT_IGNORESLOWDOWN))
|
||||
ignoreslow = 1
|
||||
|
||||
if(H.has_gravity())
|
||||
gravity = 1
|
||||
|
||||
if(!gravity)
|
||||
var/obj/item/tank/jetpack/J = H.back
|
||||
var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit
|
||||
@@ -1551,6 +1552,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H)
|
||||
var/hit_percent = (100-(blocked+armor))/100
|
||||
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
|
||||
if(!damage || hit_percent <= 0)
|
||||
return 0
|
||||
|
||||
@@ -1568,27 +1570,27 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(BRUTE)
|
||||
H.damageoverlaytemp = 20
|
||||
if(BP)
|
||||
if(BP.receive_damage(damage * hit_percent * brutemod, 0))
|
||||
if(BP.receive_damage(damage * hit_percent * brutemod * H.physiology.brute_mod, 0))
|
||||
H.update_damage_overlays()
|
||||
else//no bodypart, we deal damage with a more general method.
|
||||
H.adjustBruteLoss(damage * hit_percent * brutemod)
|
||||
H.adjustBruteLoss(damage * hit_percent * brutemod * H.physiology.brute_mod)
|
||||
if(BURN)
|
||||
H.damageoverlaytemp = 20
|
||||
if(BP)
|
||||
if(BP.receive_damage(0, damage * hit_percent * burnmod))
|
||||
if(BP.receive_damage(0, damage * hit_percent * burnmod * H.physiology.burn_mod))
|
||||
H.update_damage_overlays()
|
||||
else
|
||||
H.adjustFireLoss(damage * hit_percent* burnmod)
|
||||
H.adjustFireLoss(damage * hit_percent * burnmod * H.physiology.burn_mod)
|
||||
if(TOX)
|
||||
H.adjustToxLoss(damage * hit_percent)
|
||||
H.adjustToxLoss(damage * hit_percent * H.physiology.tox_mod)
|
||||
if(OXY)
|
||||
H.adjustOxyLoss(damage * hit_percent)
|
||||
H.adjustOxyLoss(damage * hit_percent * H.physiology.oxy_mod)
|
||||
if(CLONE)
|
||||
H.adjustCloneLoss(damage * hit_percent)
|
||||
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
|
||||
if(STAMINA)
|
||||
H.adjustStaminaLoss(damage * hit_percent)
|
||||
H.adjustStaminaLoss(damage * hit_percent * H.physiology.stamina_mod)
|
||||
if(BRAIN)
|
||||
H.adjustBrainLoss(damage * hit_percent)
|
||||
H.adjustBrainLoss(damage * hit_percent * H.physiology.brain_mod)
|
||||
return 1
|
||||
|
||||
/datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
@@ -1656,7 +1658,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
burn_damage = HEAT_DAMAGE_LEVEL_3
|
||||
else
|
||||
burn_damage = HEAT_DAMAGE_LEVEL_2
|
||||
burn_damage *= heatmod
|
||||
burn_damage = burn_damage * heatmod * H.physiology.heat_mod
|
||||
if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans
|
||||
H.emote("scream")
|
||||
H.apply_damage(burn_damage, BURN)
|
||||
@@ -1664,13 +1666,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
switch(H.bodytemperature)
|
||||
if(200 to BODYTEMP_COLD_DAMAGE_LIMIT)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 1)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod, BURN)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN)
|
||||
if(120 to 200)
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 2)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod, BURN)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod*H.physiology.cold_mod, BURN)
|
||||
else
|
||||
H.throw_alert("temp", /obj/screen/alert/cold, 3)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod, BURN)
|
||||
H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN)
|
||||
|
||||
else
|
||||
H.clear_alert("temp")
|
||||
@@ -1680,7 +1682,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
switch(adjusted_pressure)
|
||||
if(HAZARD_HIGH_PRESSURE to INFINITY)
|
||||
if(!(RESISTPRESSURE in species_traits))
|
||||
H.adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
|
||||
H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod)
|
||||
H.throw_alert("pressure", /obj/screen/alert/highpressure, 2)
|
||||
else
|
||||
H.clear_alert("pressure")
|
||||
@@ -1694,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(H.dna.check_mutation(COLDRES) || (RESISTPRESSURE in species_traits))
|
||||
H.clear_alert("pressure")
|
||||
else
|
||||
H.adjustBruteLoss( LOW_PRESSURE_DAMAGE )
|
||||
H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod)
|
||||
H.throw_alert("pressure", /obj/screen/alert/lowpressure, 2)
|
||||
|
||||
//////////
|
||||
@@ -1782,7 +1784,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
////////////
|
||||
|
||||
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
|
||||
. = stunmod * amount
|
||||
. = stunmod * H.physiology.stun_mod * amount
|
||||
|
||||
//////////////
|
||||
//Space Move//
|
||||
|
||||
@@ -73,28 +73,28 @@
|
||||
if(B)
|
||||
. = B.traumas
|
||||
|
||||
/mob/living/carbon/proc/has_trauma_type(brain_trauma_type, consider_permanent = FALSE)
|
||||
/mob/living/carbon/proc/has_trauma_type(brain_trauma_type, resilience)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.has_trauma_type(brain_trauma_type, consider_permanent)
|
||||
. = B.has_trauma_type(brain_trauma_type, resilience)
|
||||
|
||||
/mob/living/carbon/proc/gain_trauma(datum/brain_trauma/trauma, permanent = FALSE, list/arguments)
|
||||
/mob/living/carbon/proc/gain_trauma(datum/brain_trauma/trauma, resilience, list/arguments)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.gain_trauma(trauma, permanent, arguments)
|
||||
. = B.gain_trauma(trauma, resilience, arguments)
|
||||
|
||||
/mob/living/carbon/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, permanent = FALSE)
|
||||
/mob/living/carbon/proc/gain_trauma_type(brain_trauma_type = /datum/brain_trauma, resilience)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.gain_trauma_type(brain_trauma_type, permanent)
|
||||
. = B.gain_trauma_type(brain_trauma_type, resilience)
|
||||
|
||||
/mob/living/carbon/proc/cure_trauma_type(brain_trauma_type, cure_permanent = FALSE)
|
||||
/mob/living/carbon/proc/cure_trauma_type(resilience)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.cure_trauma_type(brain_trauma_type, cure_permanent)
|
||||
. = B.cure_trauma_type(resilience)
|
||||
|
||||
/mob/living/carbon/proc/cure_all_traumas(cure_permanent = FALSE)
|
||||
/mob/living/carbon/proc/cure_all_traumas(resilience)
|
||||
var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN)
|
||||
if(B)
|
||||
. = B.cure_all_traumas(cure_permanent)
|
||||
. = B.cure_all_traumas(resilience)
|
||||
|
||||
|
||||
@@ -78,9 +78,6 @@
|
||||
O.setBrainLoss(getBrainLoss(), 0)
|
||||
O.updatehealth()
|
||||
O.radiation = radiation
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/BT = T
|
||||
O.gain_trauma(BT.type, BT.permanent)
|
||||
|
||||
//re-add implants to new mob
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
@@ -238,9 +235,6 @@
|
||||
O.setBrainLoss(getBrainLoss(), 0)
|
||||
O.updatehealth()
|
||||
O.radiation = radiation
|
||||
for(var/T in get_traumas())
|
||||
var/datum/brain_trauma/BT = T
|
||||
O.gain_trauma(BT.type, BT.permanent)
|
||||
|
||||
//re-add implants to new mob
|
||||
if (tr_flags & TR_KEEPIMPLANTS)
|
||||
|
||||
Reference in New Issue
Block a user