//entirely neutral or internal status effects go here /datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers id = "crusher_damage" duration = -1 tick_interval = -1 status_type = STATUS_EFFECT_UNIQUE alert_type = null var/total_damage = 0 /datum/status_effect/syphon_mark id = "syphon_mark" duration = 50 status_type = STATUS_EFFECT_MULTIPLE alert_type = null on_remove_on_mob_delete = TRUE var/obj/item/borg/upgrade/modkit/bounty/reward_target /datum/status_effect/syphon_mark/on_creation(mob/living/new_owner, obj/item/borg/upgrade/modkit/bounty/new_reward_target) . = ..() if(.) reward_target = new_reward_target /datum/status_effect/syphon_mark/on_apply() if(owner.stat == DEAD) return FALSE return ..() /datum/status_effect/syphon_mark/proc/get_kill() if(!QDELETED(reward_target)) reward_target.get_kill(owner) /datum/status_effect/syphon_mark/tick() if(owner.stat == DEAD) get_kill() qdel(src) /datum/status_effect/syphon_mark/on_remove() get_kill() . = ..() /atom/movable/screen/alert/status_effect/in_love name = "In Love" desc = "You feel so wonderfully in love!" icon_state = "in_love" /datum/status_effect/in_love id = "in_love" duration = -1 status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/in_love var/hearts /datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/date) . = ..() if(!.) return linked_alert.desc = "You're in love with [date.real_name]! How lovely." hearts = WEAKREF(date.add_alt_appearance( /datum/atom_hud/alternate_appearance/basic/one_person, "in_love", image(icon = 'icons/effects/effects.dmi', icon_state = "love_hearts", loc = date), new_owner, )) /datum/status_effect/in_love/on_remove() QDEL_NULL(hearts) /datum/status_effect/throat_soothed id = "throat_soothed" duration = 60 SECONDS status_type = STATUS_EFFECT_REFRESH alert_type = null /datum/status_effect/throat_soothed/on_apply() . = ..() ADD_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") /datum/status_effect/throat_soothed/on_remove() . = ..() REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]") /datum/status_effect/bounty id = "bounty" status_type = STATUS_EFFECT_UNIQUE var/mob/living/rewarded /datum/status_effect/bounty/on_creation(mob/living/new_owner, mob/living/caster) . = ..() if(.) rewarded = caster /datum/status_effect/bounty/on_apply() to_chat(owner, "You hear something behind you talking... You have been marked for death by [rewarded]. If you die, they will be rewarded.") playsound(owner, 'sound/weapons/gun/shotgun/rack.ogg', 75, FALSE) return ..() /datum/status_effect/bounty/tick() if(owner.stat == DEAD) rewards() qdel(src) /datum/status_effect/bounty/proc/rewards() if(rewarded && rewarded.mind && rewarded.stat != DEAD) to_chat(owner, "You hear something behind you talking... Bounty claimed.") playsound(owner, 'sound/weapons/gun/shotgun/shot.ogg', 75, FALSE) to_chat(rewarded, "You feel a surge of mana flow into you!") for(var/obj/effect/proc_holder/spell/spell in rewarded.mind.spell_list) spell.charge_counter = spell.charge_max spell.recharging = FALSE spell.update_appearance() rewarded.adjustBruteLoss(-25) rewarded.adjustFireLoss(-25) rewarded.adjustToxLoss(-25) rewarded.adjustOxyLoss(-25) rewarded.adjustCloneLoss(-25) // heldup is for the person being aimed at /datum/status_effect/grouped/heldup id = "heldup" duration = -1 tick_interval = -1 status_type = STATUS_EFFECT_MULTIPLE alert_type = /atom/movable/screen/alert/status_effect/heldup /atom/movable/screen/alert/status_effect/heldup name = "Held Up" desc = "Making any sudden moves would probably be a bad idea!" icon_state = "aimed" /datum/status_effect/grouped/heldup/on_apply() owner.apply_status_effect(STATUS_EFFECT_SURRENDER, src) return ..() /datum/status_effect/grouped/heldup/on_remove() owner.remove_status_effect(STATUS_EFFECT_SURRENDER, src) return ..() // holdup is for the person aiming /datum/status_effect/holdup id = "holdup" duration = -1 tick_interval = -1 status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/holdup /atom/movable/screen/alert/status_effect/holdup name = "Holding Up" desc = "You're currently pointing a gun at someone." icon_state = "aimed" // this status effect is used to negotiate the high-fiving capabilities of all concerned parties /datum/status_effect/high_fiving id = "high_fiving" duration = -1 tick_interval = -1 status_type = STATUS_EFFECT_UNIQUE alert_type = null /// The carbons who were offered the ability to partake in the high-five var/list/possible_takers /// The actual slapper item var/obj/item/slapper/slap_item /datum/status_effect/high_fiving/on_creation(mob/living/new_owner, obj/item/slap) . = ..() if(!.) return slap_item = slap owner.visible_message("[owner] raises [owner.p_their()] arm, looking for a high-five!", \ "You post up, looking for a high-five!", null, 2) for(var/mob/living/carbon/possible_taker in orange(1, owner)) if(!owner.CanReach(possible_taker) || possible_taker.incapacitated()) continue register_candidate(possible_taker) if(!possible_takers) // in case we tried high-fiving with only a dead body around or something owner.visible_message("[owner] realizes no one within range is actually capable of high-fiving, lowering [owner.p_their()] arm in shame...", \ "You realize a moment too late that no one within range is actually capable of high-fiving you, oof...", null, 2) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five_alone) qdel(src) return RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/check_owner_in_range) RegisterSignal(slap_item, list(COMSIG_PARENT_QDELETING, COMSIG_ITEM_DROPPED), .proc/dropped_slap) RegisterSignal(owner, COMSIG_PARENT_EXAMINE_MORE, .proc/check_fake_out) /datum/status_effect/high_fiving/Destroy() QDEL_NULL(slap_item) for(var/i in possible_takers) var/mob/living/carbon/lost_hope = i remove_candidate(lost_hope) LAZYCLEARLIST(possible_takers) return ..() /// Hook up the specified carbon mob for possible high-fiving, give them the alert and signals and all /datum/status_effect/high_fiving/proc/register_candidate(mob/living/carbon/possible_candidate) var/atom/movable/screen/alert/highfive/G = possible_candidate.throw_alert("[owner]", /atom/movable/screen/alert/highfive) if(!G) return LAZYADD(possible_takers, possible_candidate) RegisterSignal(possible_candidate, COMSIG_MOVABLE_MOVED, .proc/check_taker_in_range) G.setup(possible_candidate, owner, slap_item) /// Remove the alert and signals for the specified carbon mob /datum/status_effect/high_fiving/proc/remove_candidate(mob/living/carbon/removed_candidate) removed_candidate.clear_alert("[owner]") LAZYREMOVE(possible_takers, removed_candidate) UnregisterSignal(removed_candidate, COMSIG_MOVABLE_MOVED) /// We failed to high-five broh, either because there's no one viable next to us anymore, or we lost the slapper, or what /datum/status_effect/high_fiving/proc/fail() owner.visible_message("[owner] slowly lowers [owner.p_their()] arm, realizing no one will high-five [owner.p_them()]! How embarassing...", \ "You realize the futility of continuing to wait for a high-five, and lower your arm...", null, 2) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/left_hanging) qdel(src) /// Yeah broh! This is where we do the high-fiving (or high-tenning :o) /datum/status_effect/high_fiving/proc/we_did_it(mob/living/carbon/successful_taker) var/open_hands_taker var/slappers_owner for(var/i in successful_taker.held_items) // see how many hands the taker has open for high'ing if(isnull(i)) open_hands_taker++ if(!open_hands_taker) to_chat(successful_taker, "You can't high-five [owner] with no open hands!") SEND_SIGNAL(successful_taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five_full_hand) // not so successful now! return for(var/i in owner.held_items) var/obj/item/slapper/slap_check = i if(istype(slap_check)) slappers_owner++ if(!slappers_owner) // THE PRANKAGE too_slow_p1(successful_taker) return if(slappers_owner >= 2) // we only check this if it's already established the taker has 2+ hands free owner.visible_message("[successful_taker] enthusiastically high-tens [owner]!", "Wow! You're high-tenned [successful_taker]!", "You hear a sickening sound of flesh hitting flesh!", ignored_mobs=successful_taker) to_chat(successful_taker, "You give high-tenning [owner] your all!") playsound(owner, 'sound/weapons/slap.ogg', 100, TRUE, 1) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_ten) SEND_SIGNAL(successful_taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_ten) else owner.visible_message("[successful_taker] high-fives [owner]!", "All right! You're high-fived by [successful_taker]!", "You hear a sickening sound of flesh hitting flesh!", ignored_mobs=successful_taker) to_chat(successful_taker, "You high-five [owner]!") playsound(owner, 'sound/weapons/slap.ogg', 50, TRUE, -1) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five) SEND_SIGNAL(successful_taker, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/high_five) qdel(src) /// If we don't have any slappers in hand when someone goes to high-five us, we prank the hell out of them /datum/status_effect/high_fiving/proc/too_slow_p1(mob/living/carbon/rube) owner.visible_message("[rube] rushes in to high-five [owner], but-", "[rube] falls for your trick just as planned, lunging for a high-five that no longer exists! Classic!", ignored_mobs=rube) to_chat(rube, "You go in for [owner]'s high-five, but-") addtimer(CALLBACK(src, .proc/too_slow_p2, rube), 0.5 SECONDS) /// Part two of the ultimate prank /datum/status_effect/high_fiving/proc/too_slow_p2(mob/living/carbon/rube) if(!owner || !rube) qdel(src) return owner.visible_message("[owner] pulls away from [rube]'s slap at the last second, dodging the high-five entirely!", "[rube] fails to make contact with your hand, making an utter fool of [rube.p_them()]self!", "You hear a disappointing sound of flesh not hitting flesh!", ignored_mobs=rube) var/all_caps_for_emphasis = uppertext("NO! [owner] PULLS [owner.p_their()] HAND AWAY FROM YOURS! YOU'RE TOO SLOW!") to_chat(rube, "[all_caps_for_emphasis]") playsound(owner, 'sound/weapons/thudswoosh.ogg', 100, TRUE, 1) rube.Knockdown(1 SECONDS) SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/down_low) SEND_SIGNAL(rube, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/too_slow) qdel(src) /// If someone examine_more's us while we don't have a slapper in hand, it'll tip them off to our trickster ways /datum/status_effect/high_fiving/proc/check_fake_out(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER if(!slap_item) examine_list += "[owner]'s arm appears tensed up, as if [owner.p_they()] plan on pulling it back suddenly...\n" /// One of our possible takers moved, see if they left us hanging /datum/status_effect/high_fiving/proc/check_taker_in_range(mob/living/carbon/taker) SIGNAL_HANDLER if(owner.CanReach(taker) && !taker.incapacitated()) return to_chat(taker, "You left [owner] hanging!") remove_candidate(taker) if(!possible_takers) fail() /// The propositioner moved, see if anyone is out of range now /datum/status_effect/high_fiving/proc/check_owner_in_range(mob/living/carbon/source) SIGNAL_HANDLER for(var/i in possible_takers) var/mob/living/carbon/checking_taker = i if(!istype(checking_taker) || !owner.CanReach(checking_taker) || checking_taker.incapacitated()) remove_candidate(checking_taker) if(!possible_takers) fail() /// Something fishy is going on here... /datum/status_effect/high_fiving/proc/dropped_slap(obj/item/source) slap_item = null //this effect gives the user an alert they can use to surrender quickly /datum/status_effect/grouped/surrender id = "surrender" duration = -1 tick_interval = -1 status_type = STATUS_EFFECT_UNIQUE alert_type = /atom/movable/screen/alert/status_effect/surrender /atom/movable/screen/alert/status_effect/surrender name = "Surrender" desc = "Looks like you're in trouble now, bud. Click here to surrender. (Warning: You will be incapacitated.)" icon_state = "surrender" /atom/movable/screen/alert/status_effect/surrender/Click(location, control, params) . = ..() if(!.) return owner.emote("surrender") /* * A status effect used for preventing caltrop message spam * * While a mob has this status effect, they won't recieve any messages about * stepping on caltrops. But they will be stunned and damaged regardless. * * The status effect itself has no effect, other than to disappear after * a second. */ /datum/status_effect/caltropped id = "caltropped" duration = 1 SECONDS tick_interval = INFINITY status_type = STATUS_EFFECT_REFRESH alert_type = null