//? Incapacitation /** * default method of kicking a poor guy down to the ground * * @params * - amount - standard strength in deciseconds */ /mob/proc/default_combat_knockdown(amount) return afflict_knockdown(sqrt(40)) /mob/proc/is_stunned() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/stun) /mob/proc/afflict_stun(amount) if(!(status_flags & STATUS_CAN_STUN)) return FALSE apply_status_effect(/datum/status_effect/incapacitation/stun, amount) return TRUE /mob/proc/set_stunned(amount) if(!(status_flags & STATUS_CAN_STUN)) return FALSE if(amount == 0) remove_status_effect(/datum/status_effect/incapacitation/stun) else var/datum/status_effect/effect = is_stunned() if(effect) effect.set_duration_from_now(amount) else if(amount > 0) afflict_stun(amount) return TRUE /mob/proc/adjust_stunned(amount) if(!(status_flags & STATUS_CAN_STUN)) return FALSE var/datum/status_effect/effect = is_stunned() if(effect) effect.adjust_duration(amount) else if(amount > 0) afflict_stun(amount) return TRUE /mob/proc/is_knockdown() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/knockdown) /mob/proc/afflict_knockdown(amount) if(!(status_flags & STATUS_CAN_KNOCKDOWN)) return FALSE apply_status_effect(/datum/status_effect/incapacitation/knockdown, amount) return TRUE /mob/proc/set_knockdown(amount) if(!(status_flags & STATUS_CAN_KNOCKDOWN)) return FALSE if(amount == 0) remove_status_effect(/datum/status_effect/incapacitation/knockdown) else var/datum/status_effect/effect = is_knockdown() if(effect) effect.set_duration_from_now(amount) else if(amount > 0) afflict_knockdown(amount) return TRUE /mob/proc/adjust_knockdown(amount) if(!(status_flags & STATUS_CAN_KNOCKDOWN)) return FALSE var/datum/status_effect/effect = is_knockdown() if(effect) effect.adjust_duration(amount) else if(amount > 0) afflict_knockdown(amount) return TRUE /mob/proc/is_paralyzed() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/paralyze) /mob/proc/afflict_paralyze(amount) if(!(status_flags & STATUS_CAN_PARALYZE)) return FALSE apply_status_effect(/datum/status_effect/incapacitation/paralyze, amount) return TRUE /mob/proc/adjust_paralyzed(amount) if(!(status_flags & STATUS_CAN_PARALYZE)) return FALSE var/datum/status_effect/effect = is_paralyzed() if(effect) effect.adjust_duration(amount) else if(amount > 0) afflict_paralyze(amount) return TRUE /mob/proc/set_paralyzed(amount) if(!(status_flags & STATUS_CAN_PARALYZE)) return FALSE if(amount == 0) remove_status_effect(/datum/status_effect/incapacitation/paralyze) else var/datum/status_effect/effect = is_paralyzed() if(effect) effect.set_duration_from_now(amount) else if(amount > 0) afflict_paralyze(amount) return TRUE /mob/proc/is_rooted() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/root) /mob/proc/afflict_root(amount) if(!(status_flags & STATUS_CAN_ROOT)) return FALSE apply_status_effect(/datum/status_effect/incapacitation/root, amount) return TRUE /mob/proc/adjust_rooted(amount) if(!(status_flags & STATUS_CAN_ROOT)) return FALSE var/datum/status_effect/effect = is_rooted() if(effect) effect.adjust_duration(amount) else if(amount > 0) afflict_root(amount) return TRUE /mob/proc/set_rooted(amount) if(!(status_flags & STATUS_CAN_ROOT)) return FALSE if(amount == 0) remove_status_effect(/datum/status_effect/incapacitation/root) else var/datum/status_effect/effect = is_rooted() if(effect) effect.set_duration_from_now(amount) else if(amount > 0) afflict_root(amount) return TRUE /mob/proc/is_dazed() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/daze) /mob/proc/afflict_daze(amount) if(!(status_flags & STATUS_CAN_ROOT)) return FALSE apply_status_effect(/datum/status_effect/incapacitation/daze, amount) return TRUE /mob/proc/adjust_dazed(amount) if(!(status_flags & STATUS_CAN_ROOT)) return FALSE var/datum/status_effect/effect = is_dazed() if(effect) effect.adjust_duration(amount) else if(amount > 0) afflict_daze(amount) return TRUE /mob/proc/set_dazed(amount) if(!(status_flags & STATUS_CAN_ROOT)) return FALSE if(amount == 0) remove_status_effect(/datum/status_effect/incapacitation/daze) else var/datum/status_effect/effect = is_dazed() if(effect) effect.set_duration_from_now(amount) else if(amount > 0) afflict_daze(amount) return TRUE /** * apply a staggering effect * * @params * * source - source enum * * strength - how strong of a slowdown. the maximum of all stagger effects is taken * * duration - how long to stagger for */ /mob/proc/afflict_stagger(source, strength, duration) apply_grouped_status_effect(/datum/status_effect/grouped/staggered, source, strength, duration) /** * removes a staggering effect source * * @params * * source - source enum * * duration - the duration to remove. if null (default), removes all. */ /mob/proc/cure_stagger(source, duration) if(!isnull(duration)) var/datum/status_effect/grouped/effect = is_staggered() effect.set_source(source, duration = duration) return remove_grouped_status_effect(/datum/status_effect/grouped/staggered, source) /mob/proc/is_staggered() RETURN_TYPE(/datum/status_effect/grouped/staggered) return has_status_effect(/datum/status_effect/grouped/staggered) /mob/proc/is_unconscious() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/unconscious) /mob/proc/afflict_unconscious(amount) apply_status_effect(/datum/status_effect/incapacitation/unconscious, amount) return TRUE /mob/proc/set_unconscious(amount) var/datum/status_effect/incapacitation/unconscious/effect = is_unconscious() if(isnull(effect)) if(!amount) return apply_status_effect(/datum/status_effect/incapacitation/unconscious, amount) else effect.set_duration_from_now(amount) return TRUE /mob/proc/adjust_unconscious(amount) var/datum/status_effect/incapacitation/unconscious/effect = is_unconscious() if(isnull(effect)) if(amount <= 0) return apply_status_effect(/datum/status_effect/incapacitation/unconscious, amount) else effect.adjust_duration(amount) return TRUE /mob/proc/is_sleeping() RETURN_TYPE(/datum/status_effect) return has_status_effect(/datum/status_effect/incapacitation/sleeping) /mob/proc/afflict_sleeping(amount) apply_status_effect(/datum/status_effect/incapacitation/sleeping, amount) return TRUE /mob/proc/set_sleeping(amount) var/datum/status_effect/incapacitation/sleeping/effect = is_sleeping() if(isnull(effect)) if(!amount) return apply_status_effect(/datum/status_effect/incapacitation/sleeping, amount) else effect.set_duration_from_now(amount) return TRUE /mob/proc/adjust_sleeping(amount) var/datum/status_effect/incapacitation/sleeping/effect = is_sleeping() if(isnull(effect)) if(amount <= 0) return apply_status_effect(/datum/status_effect/incapacitation/sleeping, amount) else effect.adjust_duration(amount) return TRUE /** * heals all incapacitation effects * * @params * * amount - if null, remove all immediately. */ /mob/proc/clear_all_incapacitation_effects(amount) ASSERT(isnull(amount) || amount > 0) for(var/datum/status_effect/incapacitation/path as anything in subtypesof(/datum/status_effect/incapacitation)) var/datum/status_effect/incapacitation/effect = has_status_effect(path) if(isnull(effect)) continue if(!isnull(amount)) effect.adjust_duration(-amount) else qdel(effect) //? legacy /mob/proc/Confuse(amount) confused = max(confused, amount, 0) /mob/proc/SetConfused(amount) confused = max(amount, 0) /mob/proc/AdjustConfused(amount) confused = max(confused + amount, 0) /mob/proc/add_blindness_source(source) ADD_TRAIT(src, TRAIT_BLIND, source) overlay_fullscreen("blind", /atom/movable/screen/fullscreen/scaled/blind) /mob/proc/remove_blindness_source(source) REMOVE_TRAIT(src, TRAIT_BLIND, source) if(!HAS_TRAIT(src, TRAIT_BLIND)) clear_fullscreen("blind") /mob/proc/blindness_handle_reconnect() if(HAS_TRAIT(src, TRAIT_BLIND)) clear_fullscreen("blind") overlay_fullscreen("blind", /atom/movable/screen/fullscreen/scaled/blind)