mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 03:02:54 +00:00
Now it only affects limbs. Icon is changed to deformed to reflect it. Dead limbs do not cause pain messages.
123 lines
3.6 KiB
Plaintext
123 lines
3.6 KiB
Plaintext
mob/proc/flash_pain()
|
|
flick("pain",pain)
|
|
|
|
mob/var/list/pain_stored = list()
|
|
mob/var/last_pain_message = ""
|
|
mob/var/next_pain_time = 0
|
|
|
|
// partname is the name of a body part
|
|
// amount is a num from 1 to 100
|
|
mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0)
|
|
if(stat >= 2) return
|
|
if(reagents.has_reagent("tramadol"))
|
|
return
|
|
if(reagents.has_reagent("oxycodone"))
|
|
return
|
|
if(analgesic)
|
|
return
|
|
if(world.time < next_pain_time && !force)
|
|
return
|
|
if(amount > 10 && istype(src,/mob/living/carbon/human))
|
|
if(src:paralysis)
|
|
src:paralysis = max(0, src:paralysis-round(amount/10))
|
|
if(amount > 50 && prob(amount / 5))
|
|
src:drop_item()
|
|
var/msg
|
|
if(burning)
|
|
switch(amount)
|
|
if(1 to 10)
|
|
msg = "\red <b>Your [partname] burns.</b>"
|
|
if(11 to 90)
|
|
flash_weak_pain()
|
|
msg = "\red <b><font size=2>Your [partname] burns badly!</font></b>"
|
|
if(91 to 10000)
|
|
flash_pain()
|
|
msg = "\red <b><font size=3>OH GOD! Your [partname] is on fire!</font></b>"
|
|
else
|
|
switch(amount)
|
|
if(1 to 10)
|
|
msg = "<b>Your [partname] hurts.</b>"
|
|
if(11 to 90)
|
|
flash_weak_pain()
|
|
msg = "<b><font size=2>Your [partname] hurts badly.</font></b>"
|
|
if(91 to 10000)
|
|
flash_pain()
|
|
msg = "<b><font size=3>OH GOD! Your [partname] is hurting terribly!</font></b>"
|
|
if(msg && (msg != last_pain_message || prob(10)))
|
|
last_pain_message = msg
|
|
src << msg
|
|
next_pain_time = world.time + (100 - amount)
|
|
|
|
|
|
// message is the custom message to be displayed
|
|
// flash_strength is 0 for weak pain flash, 1 for strong pain flash
|
|
mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
|
|
if(stat >= 1) return
|
|
if(reagents.has_reagent("tramadol"))
|
|
return
|
|
if(reagents.has_reagent("oxycodone"))
|
|
return
|
|
if(analgesic)
|
|
return
|
|
var/msg = "\red <b>[message]</b>"
|
|
if(flash_strength >= 1)
|
|
msg = "\red <font size=3><b>[message]</b></font>"
|
|
|
|
// Anti message spam checks
|
|
if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time)))
|
|
last_pain_message = msg
|
|
src << msg
|
|
next_pain_time = world.time + 100
|
|
|
|
mob/living/carbon/human/proc/handle_pain()
|
|
// not when sleeping
|
|
if(stat >= 2) return
|
|
if(reagents.has_reagent("tramadol"))
|
|
return
|
|
if(reagents.has_reagent("oxycodone"))
|
|
return
|
|
if(analgesic)
|
|
return
|
|
var/maxdam = 0
|
|
var/datum/organ/external/damaged_organ = null
|
|
for(var/datum/organ/external/E in organs)
|
|
// amputated limbs don't cause pain
|
|
if(E.amputated) continue
|
|
if(E.status & ORGAN_DEAD) continue
|
|
var/dam = E.get_damage()
|
|
// make the choice of the organ depend on damage,
|
|
// but also sometimes use one of the less damaged ones
|
|
if(dam > maxdam && (maxdam == 0 || prob(70)) )
|
|
damaged_organ = E
|
|
maxdam = dam
|
|
if(damaged_organ)
|
|
pain(damaged_organ.display_name, maxdam, 0)
|
|
|
|
// Damage to internal organs hurts a lot.
|
|
for(var/organ_name in internal_organs)
|
|
var/datum/organ/internal/I = internal_organs[organ_name]
|
|
if(I.damage > 2) if(prob(2))
|
|
var/datum/organ/external/parent = get_organ(I.parent_organ)
|
|
src.custom_pain("You feel a sharp pain in your [parent.display_name]", 1)
|
|
|
|
var/toxDamageMessage = null
|
|
var/toxMessageProb = 1
|
|
switch(getToxLoss())
|
|
if(1 to 5)
|
|
toxMessageProb = 1
|
|
toxDamageMessage = "Your body stings slightly."
|
|
if(6 to 10)
|
|
toxMessageProb = 2
|
|
toxDamageMessage = "Your whole body hurts a little."
|
|
if(11 to 15)
|
|
toxMessageProb = 2
|
|
toxDamageMessage = "Your whole body hurts."
|
|
if(15 to 25)
|
|
toxMessageProb = 3
|
|
toxDamageMessage = "Your whole body hurts badly."
|
|
if(26 to INFINITY)
|
|
toxMessageProb = 5
|
|
toxDamageMessage = "Your body aches all over, it's driving you mad."
|
|
|
|
if(toxDamageMessage && prob(toxMessageProb))
|
|
src.custom_pain(toxDamageMessage, getToxLoss() >= 15) |