@@ -1,12 +1,108 @@
|
||||
//Here are the procs used to modify status effects of a mob.
|
||||
//The effects include: stunned, weakened, paralysis, sleeping, resting, jitteriness, dizziness,
|
||||
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness,
|
||||
// eye damage, eye_blind, eye_blurry, druggy, BLIND disability, and NEARSIGHT disability.
|
||||
|
||||
|
||||
//////////////////////////////STUN ////////////////////////////////////
|
||||
////////////////////////////// STUN ////////////////////////////////////
|
||||
|
||||
/mob/living/IsStun() //If we're stunned
|
||||
return has_status_effect(STATUS_EFFECT_STUN)
|
||||
|
||||
/mob/living/proc/AmountStun() //How many deciseconds remain in our stun
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
if(S)
|
||||
return S.duration - world.time
|
||||
return 0
|
||||
|
||||
/mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
|
||||
if((status_flags & CANSTUN) || ignore_canstun)
|
||||
if(absorb_stun(amount, ignore_canstun))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
if(S)
|
||||
S.duration = max(world.time + amount, S.duration)
|
||||
else if(amount > 0)
|
||||
S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
|
||||
return S
|
||||
|
||||
/mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
|
||||
if((status_flags & CANSTUN) || ignore_canstun)
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
if(amount <= 0)
|
||||
if(S)
|
||||
qdel(S)
|
||||
else
|
||||
if(absorb_stun(amount, ignore_canstun))
|
||||
return
|
||||
if(S)
|
||||
S.duration = world.time + amount
|
||||
else
|
||||
S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
|
||||
return S
|
||||
|
||||
/mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
|
||||
if((status_flags & CANSTUN) || ignore_canstun)
|
||||
if(absorb_stun(amount, ignore_canstun))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
if(S)
|
||||
S.duration += amount
|
||||
else if(amount > 0)
|
||||
S = apply_status_effect(STATUS_EFFECT_STUN, amount, updating)
|
||||
return S
|
||||
|
||||
///////////////////////////////// KNOCKDOWN /////////////////////////////////////
|
||||
|
||||
/mob/living/IsKnockdown() //If we're knocked down
|
||||
return has_status_effect(STATUS_EFFECT_KNOCKDOWN)
|
||||
|
||||
/mob/living/proc/AmountKnockdown() //How many deciseconds remain in our knockdown
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
if(K)
|
||||
return K.duration - world.time
|
||||
return 0
|
||||
|
||||
/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Can't go below remaining duration
|
||||
if((status_flags & CANKNOCKDOWN) || ignore_canknockdown)
|
||||
if(absorb_stun(amount, ignore_canknockdown))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
if(K)
|
||||
K.duration = max(world.time + amount, K.duration)
|
||||
else if(amount > 0)
|
||||
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
|
||||
return K
|
||||
|
||||
/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Sets remaining duration
|
||||
if((status_flags & CANKNOCKDOWN) || ignore_canknockdown)
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
if(amount <= 0)
|
||||
if(K)
|
||||
qdel(K)
|
||||
else
|
||||
if(absorb_stun(amount, ignore_canknockdown))
|
||||
return
|
||||
if(K)
|
||||
K.duration = world.time + amount
|
||||
else
|
||||
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
|
||||
return K
|
||||
|
||||
/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Adds to remaining duration
|
||||
if((status_flags & CANKNOCKDOWN) || ignore_canknockdown)
|
||||
if(absorb_stun(amount, ignore_canknockdown))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
if(K)
|
||||
K.duration += amount
|
||||
else if(amount > 0)
|
||||
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
|
||||
return K
|
||||
|
||||
///////////////////////////////////// STUN ABSORPTION /////////////////////////////////////
|
||||
|
||||
/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message)
|
||||
//adds a stun absorption with a key, a duration in deciseconds, its priority, and the messages it makes when you're stunned/examined, if any
|
||||
//adds a stun absorption with a key, a duration in deciseconds, its priority, and the messages it makes when you're stun/examined, if any
|
||||
if(!islist(stun_absorption))
|
||||
stun_absorption = list()
|
||||
if(stun_absorption[key])
|
||||
@@ -17,44 +113,22 @@
|
||||
stun_absorption[key] = list("end_time" = world.time + duration, "priority" = priority, "stuns_absorbed" = 0, \
|
||||
"visible_message" = message, "self_message" = self_message, "examine_message" = examine_message)
|
||||
|
||||
/mob/living/Stun(amount, updating = 1, ignore_canstun = 0)
|
||||
if(!stat && islist(stun_absorption) && (status_flags & CANSTUN || ignore_canstun))
|
||||
var/priority_absorb_key
|
||||
var/highest_priority
|
||||
for(var/i in stun_absorption)
|
||||
if(stun_absorption[i]["end_time"] > world.time && (!priority_absorb_key || stun_absorption[i]["priority"] > highest_priority))
|
||||
priority_absorb_key = stun_absorption[i]
|
||||
highest_priority = stun_absorption[i]["priority"]
|
||||
if(priority_absorb_key)
|
||||
if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"])
|
||||
if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"])
|
||||
visible_message("<span class='warning'>[src][priority_absorb_key["visible_message"]]</span>", "<span class='boldwarning'>[priority_absorb_key["self_message"]]</span>")
|
||||
else if(priority_absorb_key["visible_message"])
|
||||
visible_message("<span class='warning'>[src][priority_absorb_key["visible_message"]]</span>")
|
||||
else if(priority_absorb_key["self_message"])
|
||||
to_chat(src, "<span class='boldwarning'>[priority_absorb_key["self_message"]]</span>")
|
||||
priority_absorb_key["stuns_absorbed"] += amount
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
///////////////////////////////// WEAKEN /////////////////////////////////////
|
||||
|
||||
/mob/living/Weaken(amount, updating = 1, ignore_canweaken = 0)
|
||||
if(!stat && islist(stun_absorption) && (status_flags & CANWEAKEN || ignore_canweaken))
|
||||
var/priority_absorb_key
|
||||
var/highest_priority
|
||||
for(var/i in stun_absorption)
|
||||
if(stun_absorption[i]["end_time"] > world.time && (!priority_absorb_key || stun_absorption[i]["priority"] > highest_priority))
|
||||
priority_absorb_key = stun_absorption[i]
|
||||
highest_priority = priority_absorb_key["priority"]
|
||||
if(priority_absorb_key)
|
||||
if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"])
|
||||
if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"])
|
||||
visible_message("<span class='warning'>[src][priority_absorb_key["visible_message"]]</span>", "<span class='boldwarning'>[priority_absorb_key["self_message"]]</span>")
|
||||
else if(priority_absorb_key["visible_message"])
|
||||
visible_message("<span class='warning'>[src][priority_absorb_key["visible_message"]]</span>")
|
||||
else if(priority_absorb_key["self_message"])
|
||||
to_chat(src, "<span class='boldwarning'>[priority_absorb_key["self_message"]]</span>")
|
||||
priority_absorb_key["stuns_absorbed"] += amount
|
||||
return 0
|
||||
return ..()
|
||||
/mob/living/proc/absorb_stun(amount, ignoring_flag_presence)
|
||||
if(!amount || amount <= 0 || stat || ignoring_flag_presence || !islist(stun_absorption))
|
||||
return FALSE
|
||||
var/priority_absorb_key
|
||||
var/highest_priority
|
||||
for(var/i in stun_absorption)
|
||||
if(stun_absorption[i]["end_time"] > world.time && (!priority_absorb_key || stun_absorption[i]["priority"] > highest_priority))
|
||||
priority_absorb_key = stun_absorption[i]
|
||||
highest_priority = priority_absorb_key["priority"]
|
||||
if(priority_absorb_key)
|
||||
if(priority_absorb_key["visible_message"] || priority_absorb_key["self_message"])
|
||||
if(priority_absorb_key["visible_message"] && priority_absorb_key["self_message"])
|
||||
visible_message("<span class='warning'>[src][priority_absorb_key["visible_message"]]</span>", "<span class='boldwarning'>[priority_absorb_key["self_message"]]</span>")
|
||||
else if(priority_absorb_key["visible_message"])
|
||||
visible_message("<span class='warning'>[src][priority_absorb_key["visible_message"]]</span>")
|
||||
else if(priority_absorb_key["self_message"])
|
||||
to_chat(src, "<span class='boldwarning'>[priority_absorb_key["self_message"]]</span>")
|
||||
priority_absorb_key["stuns_absorbed"] += amount
|
||||
return TRUE
|
||||
|
||||
Reference in New Issue
Block a user