5a08a3aad0
This way you can add/remove traits without fear of other sources overriding them. Now you can add TRAIT_STUNIMMUNE to somebody without what if hulk
Notable changes:
Fakedeath now updates instantly, instead of waiting for the next life tick.
Fakedeath now sets time of death when acquired.
Removed extremely snowflake code in reagents that checked if you had morphine to remove slow immunity and so on.
Hulk no longer overrides status_flag changes, in case there are any.
279 lines
8.3 KiB
Plaintext
279 lines
8.3 KiB
Plaintext
|
|
/*
|
|
apply_damage(a,b,c)
|
|
args
|
|
a:damage - How much damage to take
|
|
b:damage_type - What type of damage to take, brute, burn
|
|
c:def_zone - Where to take the damage if its brute or burn
|
|
Returns
|
|
standard 0 if fail
|
|
*/
|
|
/mob/living/proc/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE)
|
|
var/hit_percent = (100-blocked)/100
|
|
if(!damage || (hit_percent <= 0))
|
|
return 0
|
|
switch(damagetype)
|
|
if(BRUTE)
|
|
adjustBruteLoss(damage * hit_percent)
|
|
if(BURN)
|
|
adjustFireLoss(damage * hit_percent)
|
|
if(TOX)
|
|
adjustToxLoss(damage * hit_percent)
|
|
if(OXY)
|
|
adjustOxyLoss(damage * hit_percent)
|
|
if(CLONE)
|
|
adjustCloneLoss(damage * hit_percent)
|
|
if(STAMINA)
|
|
adjustStaminaLoss(damage * hit_percent)
|
|
if(BRAIN)
|
|
adjustBrainLoss(damage * hit_percent)
|
|
return 1
|
|
|
|
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
|
|
switch(damagetype)
|
|
if(BRUTE)
|
|
return adjustBruteLoss(damage)
|
|
if(BURN)
|
|
return adjustFireLoss(damage)
|
|
if(TOX)
|
|
return adjustToxLoss(damage)
|
|
if(OXY)
|
|
return adjustOxyLoss(damage)
|
|
if(CLONE)
|
|
return adjustCloneLoss(damage)
|
|
if(STAMINA)
|
|
return adjustStaminaLoss(damage)
|
|
if(BRAIN)
|
|
return adjustBrainLoss(damage)
|
|
|
|
/mob/living/proc/get_damage_amount(damagetype = BRUTE)
|
|
switch(damagetype)
|
|
if(BRUTE)
|
|
return getBruteLoss()
|
|
if(BURN)
|
|
return getFireLoss()
|
|
if(TOX)
|
|
return getToxLoss()
|
|
if(OXY)
|
|
return getOxyLoss()
|
|
if(CLONE)
|
|
return getCloneLoss()
|
|
if(STAMINA)
|
|
return getStaminaLoss()
|
|
if(BRAIN)
|
|
return getBrainLoss()
|
|
|
|
|
|
/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0)
|
|
if(blocked >= 100)
|
|
return 0
|
|
if(brute)
|
|
apply_damage(brute, BRUTE, def_zone, blocked)
|
|
if(burn)
|
|
apply_damage(burn, BURN, def_zone, blocked)
|
|
if(tox)
|
|
apply_damage(tox, TOX, def_zone, blocked)
|
|
if(oxy)
|
|
apply_damage(oxy, OXY, def_zone, blocked)
|
|
if(clone)
|
|
apply_damage(clone, CLONE, def_zone, blocked)
|
|
if(stamina)
|
|
apply_damage(stamina, STAMINA, def_zone, blocked)
|
|
if(brain)
|
|
apply_damage(brain, BRAIN, def_zone, blocked)
|
|
return 1
|
|
|
|
|
|
|
|
/mob/living/proc/apply_effect(effect = 0,effecttype = STUN, blocked = FALSE)
|
|
var/hit_percent = (100-blocked)/100
|
|
if(!effect || (hit_percent <= 0))
|
|
return 0
|
|
switch(effecttype)
|
|
if(STUN)
|
|
Stun(effect * hit_percent)
|
|
if(KNOCKDOWN)
|
|
Knockdown(effect * hit_percent)
|
|
if(UNCONSCIOUS)
|
|
Unconscious(effect * hit_percent)
|
|
if(IRRADIATE)
|
|
radiation += max(effect * hit_percent, 0)
|
|
if(SLUR)
|
|
slurring = max(slurring,(effect * hit_percent))
|
|
if(STUTTER)
|
|
if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) // stun is usually associated with stutter
|
|
stuttering = max(stuttering,(effect * hit_percent))
|
|
if(EYE_BLUR)
|
|
blur_eyes(effect * hit_percent)
|
|
if(DROWSY)
|
|
drowsyness = max(drowsyness,(effect * hit_percent))
|
|
if(JITTER)
|
|
if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE))
|
|
jitteriness = max(jitteriness,(effect * hit_percent))
|
|
return 1
|
|
|
|
|
|
/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0)
|
|
if(blocked >= 100)
|
|
return 0
|
|
if(stun)
|
|
apply_effect(stun, STUN, blocked)
|
|
if(knockdown)
|
|
apply_effect(knockdown, KNOCKDOWN, blocked)
|
|
if(unconscious)
|
|
apply_effect(unconscious, UNCONSCIOUS, blocked)
|
|
if(irradiate)
|
|
apply_effect(irradiate, IRRADIATE, blocked)
|
|
if(slur)
|
|
apply_effect(slur, SLUR, blocked)
|
|
if(stutter)
|
|
apply_effect(stutter, STUTTER, blocked)
|
|
if(eyeblur)
|
|
apply_effect(eyeblur, EYE_BLUR, blocked)
|
|
if(drowsy)
|
|
apply_effect(drowsy, DROWSY, blocked)
|
|
if(stamina)
|
|
apply_damage(stamina, STAMINA, null, blocked)
|
|
if(jitter)
|
|
apply_effect(jitter, JITTER, blocked)
|
|
return 1
|
|
|
|
|
|
/mob/living/proc/getBruteLoss()
|
|
return bruteloss
|
|
|
|
/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
bruteloss = CLAMP((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/getOxyLoss()
|
|
return oxyloss
|
|
|
|
/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
oxyloss = CLAMP((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(status_flags & GODMODE)
|
|
return 0
|
|
oxyloss = amount
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/getToxLoss()
|
|
return toxloss
|
|
|
|
/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
toxloss = CLAMP((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/setToxLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
toxloss = amount
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/getFireLoss()
|
|
return fireloss
|
|
|
|
/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
fireloss = CLAMP((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/getCloneLoss()
|
|
return cloneloss
|
|
|
|
/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
cloneloss = CLAMP((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/setCloneLoss(amount, updating_health = TRUE, forced = FALSE)
|
|
if(!forced && (status_flags & GODMODE))
|
|
return FALSE
|
|
cloneloss = amount
|
|
if(updating_health)
|
|
updatehealth()
|
|
return amount
|
|
|
|
/mob/living/proc/getBrainLoss()
|
|
. = 0
|
|
|
|
/mob/living/proc/adjustBrainLoss(amount, maximum = BRAIN_DAMAGE_DEATH)
|
|
return
|
|
|
|
/mob/living/proc/setBrainLoss(amount)
|
|
return
|
|
|
|
/mob/living/proc/getStaminaLoss()
|
|
return staminaloss
|
|
|
|
/mob/living/proc/adjustStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
|
|
return
|
|
|
|
/mob/living/proc/setStaminaLoss(amount, updating_stamina = TRUE, forced = FALSE)
|
|
return
|
|
|
|
|
|
// heal ONE external organ, organ gets randomly selected from damaged ones.
|
|
/mob/living/proc/heal_bodypart_damage(brute, burn, updating_health = 1)
|
|
adjustBruteLoss(-brute, 0) //zero as argument for no instant health update
|
|
adjustFireLoss(-burn, 0)
|
|
if(updating_health)
|
|
updatehealth()
|
|
|
|
// damage ONE external organ, organ gets randomly selected from damaged ones.
|
|
/mob/living/proc/take_bodypart_damage(brute, burn, updating_health = 1)
|
|
adjustBruteLoss(brute, 0) //zero as argument for no instant health update
|
|
adjustFireLoss(burn, 0)
|
|
if(updating_health)
|
|
updatehealth()
|
|
|
|
// heal MANY bodyparts, in random order
|
|
/mob/living/proc/heal_overall_damage(brute, burn, only_robotic = 0, only_organic = 1, updating_health = 1)
|
|
adjustBruteLoss(-brute, 0) //zero as argument for no instant health update
|
|
adjustFireLoss(-burn, 0)
|
|
if(updating_health)
|
|
updatehealth()
|
|
|
|
// damage MANY bodyparts, in random order
|
|
/mob/living/proc/take_overall_damage(brute, burn, updating_health = 1)
|
|
adjustBruteLoss(brute, 0) //zero as argument for no instant health update
|
|
adjustFireLoss(burn, 0)
|
|
if(updating_health)
|
|
updatehealth()
|
|
|
|
//heal up to amount damage, in a given order
|
|
/mob/living/proc/heal_ordered_damage(amount, list/damage_types)
|
|
. = amount //we'll return the amount of damage healed
|
|
for(var/i in damage_types)
|
|
var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have
|
|
if(amount_to_heal)
|
|
apply_damage_type(-amount_to_heal, i)
|
|
amount -= amount_to_heal //remove what we healed from our current amount
|
|
if(!amount)
|
|
break
|
|
. -= amount //if there's leftover healing, remove it from what we return
|