mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
* Adds Bearserk combos * Adds main Bearserk file * Adds Berserker Bear Pelt to uplink items Blacklisted from Nuclear and SST because Nukies always use modsuits, and SST won't be very stealthy if it's rocking the martial arts bear pelt. * Update bearserk.dm Minor tweak * Update uplink_traitor.dm Another minor tweak * Update bear_jaws.dm * Update paw_slam.dm * Update smokey.dm * Update uplink_traitor.dm * Update bear_jaws.dm * More Balance Tweaks * Whoopsies forgot a thing * Improved flavour text for Uplink Please give a warm welcome to a new cult (that only exists in flavour); Children of Ursa Major! * More Changes * Updated flavour text for Bear Jaws * Updated flavour text for Bear Jaws * Added a bit of Smoh'Kie to Smokey * Minor alteration * Minor flavour text tweak Made with love and copious amounts of vodka * I had an even better pun idea * Made cost identical to Carp * Ticked the files * Swapped the weights of Bearserk and Carp * Moved some resistances to a status buff * Fixed inexplicably formed code bugs * More inexplicable code fuckery *scream * Part 1 of Swapping weights of Bearserk and Carp * Second part * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion I do agree the IsWeakened is rather redundant Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion * Added Suggestion * Added Suggestion * Added Suggestion However, considering the && are causing check fails, this may be reverted * Added Suggestion * Added Suggestion, may be reverted if issues arise * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added Suggestion Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Removed Antag Checks on Equipping and Unequipping the Pelt As per Contrabang's suggestion * Added a Suggestion and sound for Bearserker Rage * Added Suggestion I like consistency, so thank you Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Added placeholder status icon * Added Suggestion Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Added Suggestion Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Added Suggestion Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --------- Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com>
777 lines
28 KiB
Plaintext
777 lines
28 KiB
Plaintext
//Largely beneficial effects go here, even if they have drawbacks. An example is provided in Shadow Mend.
|
|
|
|
/datum/status_effect/his_grace
|
|
id = "his_grace"
|
|
duration = -1
|
|
tick_interval = 4
|
|
alert_type = /obj/screen/alert/status_effect/his_grace
|
|
var/bloodlust = 0
|
|
/// Attached His Grace toolbox
|
|
var/obj/item/his_grace/toolbox
|
|
|
|
/obj/screen/alert/status_effect/his_grace
|
|
name = "His Grace"
|
|
desc = "His Grace hungers, and you must feed Him."
|
|
icon_state = "his_grace"
|
|
alerttooltipstyle = "hisgrace"
|
|
|
|
/obj/screen/alert/status_effect/his_grace/MouseEntered(location, control, params)
|
|
desc = initial(desc)
|
|
var/datum/status_effect/his_grace/HG = attached_effect
|
|
desc += "<br><font size=3><b>Current Bloodthirst: [HG.bloodlust]</b></font>\
|
|
<br>Becomes undroppable at <b>[HIS_GRACE_FAMISHED]</b>\
|
|
<br>Will consume you at <b>[HIS_GRACE_CONSUME_OWNER]</b>\
|
|
<br>You have offered [HG.toolbox ? HG.toolbox.victims : 0] out of [HG.toolbox.victims_needed] sacrifices needed before ascension."
|
|
..()
|
|
|
|
/datum/status_effect/his_grace/on_apply()
|
|
add_attack_logs(owner, owner, "gained His Grace's stun immunity", ATKLOG_ALL)
|
|
owner.add_stun_absorption("hisgrace", INFINITY, 3, null, "His Grace protects you from the stun!")
|
|
return ..()
|
|
|
|
/datum/status_effect/his_grace/tick()
|
|
bloodlust = 0
|
|
var/graces = 0
|
|
var/list/held_items = list()
|
|
held_items += owner.l_hand
|
|
held_items += owner.r_hand
|
|
for(var/obj/item/his_grace/HG in held_items)
|
|
toolbox = HG
|
|
if(HG.bloodthirst > bloodlust)
|
|
bloodlust = HG.bloodthirst
|
|
if(HG.awakened)
|
|
graces++
|
|
if(!graces)
|
|
owner.apply_status_effect(STATUS_EFFECT_HISWRATH)
|
|
qdel(src)
|
|
return
|
|
var/grace_heal = bloodlust * 0.05
|
|
owner.adjustBruteLoss(-grace_heal)
|
|
owner.adjustFireLoss(-grace_heal)
|
|
owner.adjustToxLoss(-grace_heal)
|
|
owner.adjustOxyLoss(-(grace_heal * 2))
|
|
owner.adjustCloneLoss(-grace_heal)
|
|
|
|
/datum/status_effect/his_grace/on_remove()
|
|
add_attack_logs(owner, owner, "lost His Grace's stun immunity", ATKLOG_ALL)
|
|
if(islist(owner.stun_absorption) && owner.stun_absorption["hisgrace"])
|
|
owner.remove_stun_absorption("hisgrace")
|
|
toolbox = null
|
|
|
|
/datum/status_effect/shadow_mend
|
|
id = "shadow_mend"
|
|
duration = 3 SECONDS
|
|
alert_type = /obj/screen/alert/status_effect/shadow_mend
|
|
|
|
/obj/screen/alert/status_effect/shadow_mend
|
|
name = "Shadow Mend"
|
|
desc = "Shadowy energies wrap around your wounds, sealing them at a price. After healing, you will slowly lose health every three seconds for thirty seconds."
|
|
icon_state = "shadow_mend"
|
|
|
|
/datum/status_effect/shadow_mend/on_apply()
|
|
owner.visible_message("<span class='notice'>Violet light wraps around [owner]'s body!</span>", "<span class='notice'>Violet light wraps around your body!</span>")
|
|
playsound(owner, 'sound/magic/teleport_app.ogg', 50, 1)
|
|
return ..()
|
|
|
|
/datum/status_effect/shadow_mend/tick()
|
|
owner.adjustBruteLoss(-15)
|
|
owner.adjustFireLoss(-15)
|
|
|
|
/datum/status_effect/shadow_mend/on_remove()
|
|
owner.visible_message("<span class='warning'>The violet light around [owner] glows black!</span>", "<span class='warning'>The tendrils around you cinch tightly and reap their toll...</span>")
|
|
playsound(owner, 'sound/magic/teleport_diss.ogg', 50, 1)
|
|
owner.apply_status_effect(STATUS_EFFECT_VOID_PRICE)
|
|
|
|
|
|
/datum/status_effect/void_price
|
|
id = "void_price"
|
|
duration = 30 SECONDS
|
|
tick_interval = 3 SECONDS
|
|
status_type = STATUS_EFFECT_REFRESH
|
|
alert_type = /obj/screen/alert/status_effect/void_price
|
|
var/price = 3 //This is how much hp you lose per tick. Each time the buff is refreshed, it increased by 1. Healing too much in a short period of time will cause your swift demise
|
|
|
|
/obj/screen/alert/status_effect/void_price
|
|
name = "Void Price"
|
|
desc = "Black tendrils cinch tightly against you, digging wicked barbs into your flesh."
|
|
icon_state = "shadow_mend"
|
|
|
|
/datum/status_effect/void_price/tick()
|
|
playsound(owner, 'sound/weapons/bite.ogg', 50, 1)
|
|
owner.adjustBruteLoss(price)
|
|
|
|
/datum/status_effect/void_price/refresh()
|
|
price++
|
|
return ..()
|
|
|
|
/datum/status_effect/blooddrunk
|
|
id = "blooddrunk"
|
|
duration = 10
|
|
tick_interval = 0
|
|
alert_type = /obj/screen/alert/status_effect/blooddrunk
|
|
var/blooddrunk_damage_mod_remove = 4 // Damage is multiplied by this at the end of the status effect. Modify this one, it changes the _add
|
|
|
|
/obj/screen/alert/status_effect/blooddrunk
|
|
name = "Blood-Drunk"
|
|
desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect
|
|
icon_state = "blooddrunk"
|
|
|
|
/datum/status_effect/blooddrunk/on_apply()
|
|
. = ..()
|
|
if(.)
|
|
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "blooddrunk")
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
var/blooddrunk_damage_mod_add = 1 / blooddrunk_damage_mod_remove // Damage is multiplied by this at the start of the status effect. Don't modify this one directly.
|
|
H.physiology.brute_mod *= blooddrunk_damage_mod_add
|
|
H.physiology.burn_mod *= blooddrunk_damage_mod_add
|
|
H.physiology.tox_mod *= blooddrunk_damage_mod_add
|
|
H.physiology.oxy_mod *= blooddrunk_damage_mod_add
|
|
H.physiology.clone_mod *= blooddrunk_damage_mod_add
|
|
H.physiology.stamina_mod *= blooddrunk_damage_mod_add
|
|
add_attack_logs(owner, owner, "gained blood-drunk stun immunity", ATKLOG_ALL)
|
|
owner.add_stun_absorption("blooddrunk", INFINITY, 4)
|
|
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, TRUE, use_reverb = FALSE)
|
|
|
|
/datum/status_effect/blooddrunk/on_remove()
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.brute_mod *= blooddrunk_damage_mod_remove
|
|
H.physiology.burn_mod *= blooddrunk_damage_mod_remove
|
|
H.physiology.tox_mod *= blooddrunk_damage_mod_remove
|
|
H.physiology.oxy_mod *= blooddrunk_damage_mod_remove
|
|
H.physiology.clone_mod *= blooddrunk_damage_mod_remove
|
|
H.physiology.stamina_mod *= blooddrunk_damage_mod_remove
|
|
add_attack_logs(owner, owner, "lost blood-drunk stun immunity", ATKLOG_ALL)
|
|
REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, "blooddrunk")
|
|
if(islist(owner.stun_absorption) && owner.stun_absorption["blooddrunk"])
|
|
owner.remove_stun_absorption("blooddrunk")
|
|
|
|
/obj/screen/alert/status_effect/dash
|
|
name = "Dash"
|
|
desc = "Your have the ability to dash!"
|
|
icon = 'icons/mob/actions/actions.dmi'
|
|
icon_state = "genetic_jump"
|
|
|
|
/datum/status_effect/dash
|
|
id = "dash"
|
|
duration = 5 SECONDS
|
|
tick_interval = 0
|
|
alert_type = /obj/screen/alert/status_effect/dash
|
|
|
|
/datum/status_effect/bloodswell
|
|
id = "bloodswell"
|
|
duration = 30 SECONDS
|
|
tick_interval = 0
|
|
alert_type = /obj/screen/alert/status_effect/blood_swell
|
|
var/bonus_damage_applied = FALSE
|
|
|
|
/obj/screen/alert/status_effect/blood_swell
|
|
name = "Blood Swell"
|
|
desc = "Your body has been infused with crimson magics, your resistance to attacks has greatly increased!"
|
|
icon = 'icons/mob/actions/actions.dmi'
|
|
icon_state = "blood_swell_status"
|
|
|
|
/datum/status_effect/bloodswell/on_apply()
|
|
. = ..()
|
|
if(!. || !ishuman(owner))
|
|
return FALSE
|
|
ADD_TRAIT(owner, TRAIT_CHUNKYFINGERS, VAMPIRE_TRAIT)
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.brute_mod *= 0.4
|
|
H.physiology.burn_mod *= 0.5
|
|
H.physiology.stamina_mod *= 0.5
|
|
H.physiology.stun_mod *= 0.5
|
|
var/datum/antagonist/vampire/V = owner.mind.has_antag_datum(/datum/antagonist/vampire)
|
|
if(V.get_ability(/datum/vampire_passive/blood_swell_upgrade))
|
|
bonus_damage_applied = TRUE
|
|
H.physiology.melee_bonus += 10
|
|
H.dna.species.punchstunthreshold += 8 //higher chance to stun but not 100%
|
|
|
|
/datum/status_effect/bloodswell/on_remove()
|
|
if(!ishuman(owner))
|
|
return
|
|
REMOVE_TRAIT(owner, TRAIT_CHUNKYFINGERS, VAMPIRE_TRAIT)
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.brute_mod /= 0.4
|
|
H.physiology.burn_mod /= 0.5
|
|
H.physiology.stamina_mod /= 0.5
|
|
H.physiology.stun_mod /= 0.5
|
|
if(bonus_damage_applied)
|
|
bonus_damage_applied = FALSE
|
|
H.physiology.melee_bonus -= 10
|
|
H.dna.species.punchstunthreshold -= 8
|
|
|
|
/datum/status_effect/vampire_gladiator
|
|
id = "vampire_gladiator"
|
|
duration = 30 SECONDS
|
|
tick_interval = 1 SECONDS
|
|
alert_type = /obj/screen/alert/status_effect/vampire_gladiator
|
|
|
|
/obj/screen/alert/status_effect/vampire_gladiator
|
|
name = "Gladiatorial Resilience"
|
|
desc = "Roused by the thrill of the fight, your body has become more resistant to breaking!"
|
|
icon = 'icons/mob/actions/actions.dmi'
|
|
icon_state = "mech_damtype_brute"
|
|
|
|
/datum/status_effect/vampire_gladiator/on_apply()
|
|
. = ..()
|
|
var/mob/living/carbon/human/H = owner
|
|
if(!istype(H))
|
|
return
|
|
ADD_TRAIT(H, TRAIT_NO_BONES, GLADIATOR)
|
|
ADD_TRAIT(H, TRAIT_STURDY_LIMBS, GLADIATOR)
|
|
ADD_TRAIT(H, TRAIT_BURN_WOUND_IMMUNE, GLADIATOR)
|
|
ADD_TRAIT(H, TRAIT_IB_IMMUNE, GLADIATOR)
|
|
for(var/obj/item/organ/external/limb in H.bodyparts)
|
|
limb.add_limb_flags()
|
|
|
|
|
|
/datum/status_effect/vampire_gladiator/on_remove()
|
|
var/mob/living/carbon/human/H = owner
|
|
if(!istype(H))
|
|
return
|
|
REMOVE_TRAIT(H, TRAIT_NO_BONES, GLADIATOR)
|
|
REMOVE_TRAIT(H, TRAIT_STURDY_LIMBS, GLADIATOR)
|
|
REMOVE_TRAIT(H, TRAIT_BURN_WOUND_IMMUNE, GLADIATOR)
|
|
REMOVE_TRAIT(H, TRAIT_IB_IMMUNE, GLADIATOR)
|
|
for(var/obj/item/organ/external/limb in H.bodyparts)
|
|
limb.remove_limb_flags()
|
|
|
|
|
|
/datum/status_effect/vampire_gladiator/tick()
|
|
owner.adjustStaminaLoss(-20)
|
|
owner.adjustBruteLoss(-5)
|
|
owner.adjustFireLoss(-5)
|
|
|
|
/datum/status_effect/blood_rush
|
|
alert_type = null
|
|
duration = 10 SECONDS
|
|
|
|
/datum/status_effect/blood_rush/on_apply()
|
|
ADD_TRAIT(owner, TRAIT_GOTTAGOFAST, VAMPIRE_TRAIT)
|
|
return TRUE
|
|
|
|
/datum/status_effect/blood_rush/on_remove()
|
|
REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST, VAMPIRE_TRAIT)
|
|
|
|
/datum/status_effect/force_shield
|
|
id = "forceshield"
|
|
alert_type = null
|
|
status_type = STATUS_EFFECT_REFRESH
|
|
duration = 5 SECONDS
|
|
tick_interval = 0
|
|
var/mutable_appearance/shield
|
|
|
|
/datum/status_effect/force_shield/on_apply()
|
|
. = ..()
|
|
if(!. || !ishuman(owner))
|
|
return
|
|
var/mutable_appearance/MA = mutable_appearance('icons/effects/effects.dmi', "shield-old", ABOVE_MOB_LAYER)
|
|
var/mob/living/carbon/human/H = owner
|
|
H.add_overlay(MA)
|
|
shield = MA
|
|
H.add_stun_absorption("[id]", INFINITY, 1)
|
|
H.physiology.stamina_mod *= 0.1
|
|
H.physiology.brute_mod *= 0.5
|
|
H.physiology.burn_mod *= 0.5
|
|
|
|
/datum/status_effect/force_shield/on_remove()
|
|
. = ..()
|
|
var/mob/living/carbon/human/H = owner
|
|
H.cut_overlay(shield)
|
|
if(islist(owner.stun_absorption) && owner.stun_absorption["[id]"])
|
|
owner.remove_stun_absorption("[id]")
|
|
H.physiology.stamina_mod /= 0.1
|
|
H.physiology.brute_mod /= 0.5
|
|
H.physiology.burn_mod /= 0.5
|
|
|
|
|
|
//Hippocratic Oath: Applied when the Rod of Asclepius is activated.
|
|
/datum/status_effect/hippocraticOath
|
|
id = "Hippocratic Oath"
|
|
status_type = STATUS_EFFECT_UNIQUE
|
|
duration = -1
|
|
tick_interval = 25
|
|
examine_text = "<span class='notice'>They seem to have an aura of healing and helpfulness about them.</span>"
|
|
alert_type = null
|
|
var/deathTick = 0
|
|
/// How many points the rod has to heal with, maxes at 50, or whatever heal_points_max is set to.
|
|
var/heal_points = 50
|
|
/// Max heal points for the rod to spend on healing people
|
|
var/max_heal_points = 50
|
|
|
|
/datum/status_effect/hippocraticOath/on_apply()
|
|
//Makes the user passive, it's in their oath not to harm!
|
|
ADD_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
|
|
var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
|
H.add_hud_to(owner)
|
|
return ..()
|
|
|
|
/datum/status_effect/hippocraticOath/on_remove()
|
|
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "hippocraticOath")
|
|
var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
|
H.remove_hud_from(owner)
|
|
|
|
/datum/status_effect/hippocraticOath/tick()
|
|
// Death transforms you into a snake after a short grace period
|
|
if(owner.stat == DEAD)
|
|
if(deathTick < 4)
|
|
deathTick++
|
|
return
|
|
|
|
owner.visible_message("<span class='notice'>[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.</span>")
|
|
var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc)
|
|
var/list/chems = list("bicaridine", "perfluorodecalin", "kelotane")
|
|
healSnake.poison_type = pick(chems)
|
|
healSnake.name = "Asclepius's Snake"
|
|
healSnake.real_name = "Asclepius's Snake"
|
|
healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties."
|
|
new /obj/effect/decal/cleanable/ash(owner.loc)
|
|
new /obj/item/rod_of_asclepius(owner.loc)
|
|
qdel(owner)
|
|
return
|
|
|
|
// A servant of medicines stops at nothing to help others, let's give them an additional boost
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss() || H.getBrainLoss() || H.getStaminaLoss() || H.getCloneLoss()) // Avoid counting burn wounds
|
|
H.adjustBruteLoss(-1.5, robotic = TRUE)
|
|
H.adjustFireLoss(-1.5, robotic = TRUE)
|
|
H.adjustOxyLoss(-1.5)
|
|
H.adjustToxLoss(-1.5)
|
|
H.adjustBrainLoss(-1.5)
|
|
H.adjustStaminaLoss(-1.5)
|
|
H.adjustCloneLoss(-0.5)
|
|
new /obj/effect/temp_visual/heal(get_turf(H), COLOR_HEALING_GREEN)
|
|
|
|
// Regenerate points passively
|
|
if(heal_points < max_heal_points)
|
|
heal_points = min(heal_points + 3, max_heal_points)
|
|
|
|
// The main course: heal everyone around you with the points we just gained!
|
|
for(var/mob/living/L in view(7, owner))
|
|
heal(L)
|
|
if(!heal_points)
|
|
break
|
|
|
|
/datum/status_effect/hippocraticOath/proc/heal(mob/living/L)
|
|
var/starting_points = heal_points
|
|
var/force_particle = FALSE
|
|
|
|
if(ishuman(L))
|
|
heal_human(L)
|
|
else if(iscarbon(L))
|
|
if(L.health < L.maxHealth || L.getStaminaLoss()) // Carbons have no burn wounds to worry about nor brain damage to heal
|
|
L.adjustBruteLoss(-3.5)
|
|
L.adjustFireLoss(-3.5)
|
|
L.adjustOxyLoss(-3.5)
|
|
L.adjustToxLoss(-3.5)
|
|
L.adjustStaminaLoss(-3.5)
|
|
L.adjustCloneLoss(-1)
|
|
heal_points--
|
|
else if(issilicon(L))
|
|
if(L.health < L.maxHealth)
|
|
L.adjustBruteLoss(-3.5)
|
|
L.adjustFireLoss(-3.5)
|
|
heal_points--
|
|
else if(isanimal(L))
|
|
var/mob/living/simple_animal/SM = L
|
|
if(SM.health < SM.maxHealth)
|
|
SM.adjustHealth(-3.5)
|
|
force_particle = TRUE
|
|
if(prob(50)) // Animals are simpler
|
|
heal_points--
|
|
|
|
if(starting_points < heal_points || force_particle)
|
|
new /obj/effect/temp_visual/heal(get_turf(L), COLOR_HEALING_GREEN)
|
|
|
|
/datum/status_effect/hippocraticOath/proc/heal_human(mob/living/carbon/human/H)
|
|
if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss() || H.getBrainLoss() || H.getStaminaLoss() || H.getCloneLoss()) // Avoid counting burn wounds
|
|
H.adjustBruteLoss(-3.5, robotic = TRUE)
|
|
H.adjustFireLoss(-3.5, robotic = TRUE)
|
|
H.adjustOxyLoss(-3.5)
|
|
H.adjustToxLoss(-3.5)
|
|
H.adjustBrainLoss(-3.5)
|
|
H.adjustStaminaLoss(-3.5)
|
|
H.adjustCloneLoss(-1)
|
|
heal_points--
|
|
if(!heal_points)
|
|
return
|
|
|
|
for(var/obj/item/organ/external/E in H.bodyparts)
|
|
if(prob(10) && (E.status & (ORGAN_BROKEN | ORGAN_INT_BLEEDING | ORGAN_BURNT)) && !E.is_robotic())
|
|
E.mend_fracture()
|
|
E.fix_internal_bleeding()
|
|
E.fix_burn_wound()
|
|
heal_points--
|
|
if(!heal_points)
|
|
return
|
|
|
|
/obj/screen/alert/status_effect/regenerative_core
|
|
name = "Reinforcing Tendrils"
|
|
desc = "You can move faster than your broken body could normally handle!"
|
|
icon_state = "regenerative_core"
|
|
name = "Regenerative Core Tendrils"
|
|
|
|
/datum/status_effect/regenerative_core
|
|
id = "Regenerative Core"
|
|
duration = 1 MINUTES
|
|
status_type = STATUS_EFFECT_REPLACE
|
|
alert_type = /obj/screen/alert/status_effect/regenerative_core
|
|
|
|
/datum/status_effect/regenerative_core/on_apply()
|
|
ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, id)
|
|
owner.adjustBruteLoss(-25)
|
|
owner.adjustFireLoss(-25)
|
|
owner.remove_CC()
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.bodytemperature = H.dna.species.body_temperature
|
|
if(is_mining_level(H.z) || istype(get_area(H), /area/ruin/space/bubblegum_arena))
|
|
for(var/obj/item/organ/external/E in H.bodyparts)
|
|
E.fix_internal_bleeding()
|
|
E.fix_burn_wound()
|
|
E.mend_fracture()
|
|
else
|
|
to_chat(owner, "<span class='warning'>...But the core was weakened, it is not close enough to the rest of the legions of the necropolis.</span>")
|
|
else
|
|
owner.bodytemperature = BODYTEMP_NORMAL
|
|
return TRUE
|
|
|
|
/datum/status_effect/regenerative_core/on_remove()
|
|
REMOVE_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, id)
|
|
|
|
/datum/status_effect/fleshmend
|
|
duration = -1
|
|
status_type = STATUS_EFFECT_REFRESH
|
|
tick_interval = 1 SECONDS
|
|
alert_type = null
|
|
/// This diminishes the healing of fleshmend the higher it is.
|
|
var/tolerance = 1
|
|
/// This diminishes the healing of fleshmend if the user is cold when it is activated
|
|
var/freezing = FALSE
|
|
var/instance_duration = 10 // in ticks
|
|
/// a list of integers, one for each remaining instance of fleshmend.
|
|
var/list/active_instances = list()
|
|
var/ticks = 0
|
|
|
|
/datum/status_effect/fleshmend/on_apply()
|
|
apply_new_fleshmend()
|
|
return TRUE
|
|
|
|
/datum/status_effect/fleshmend/refresh()
|
|
apply_new_fleshmend()
|
|
..()
|
|
|
|
/datum/status_effect/fleshmend/proc/apply_new_fleshmend()
|
|
tolerance += 1
|
|
freezing = (owner.bodytemperature + 50 <= owner.dna.species.body_temperature)
|
|
if(freezing)
|
|
to_chat(owner, "<span class='warning'>Our healing's effectiveness is reduced \
|
|
by our cold body!</span>")
|
|
active_instances += instance_duration
|
|
|
|
/datum/status_effect/fleshmend/tick()
|
|
if(length(active_instances) >= 1)
|
|
var/heal_amount = (length(active_instances) / tolerance) * (freezing ? 2 : 10)
|
|
var/blood_restore = 30 * length(active_instances)
|
|
owner.heal_overall_damage(heal_amount, heal_amount, updating_health = FALSE)
|
|
owner.adjustOxyLoss(-heal_amount, FALSE)
|
|
owner.blood_volume = min(owner.blood_volume + blood_restore, BLOOD_VOLUME_NORMAL)
|
|
owner.updatehealth()
|
|
var/list/expired_instances = list()
|
|
for(var/i in 1 to length(active_instances))
|
|
active_instances[i]--
|
|
if(active_instances[i] <= 0)
|
|
expired_instances += active_instances[i]
|
|
active_instances -= expired_instances
|
|
tolerance = max(tolerance - 0.05, 1)
|
|
if(tolerance <= 1 && length(active_instances) == 0)
|
|
qdel(src)
|
|
|
|
/datum/status_effect/speedlegs
|
|
duration = -1
|
|
status_type = STATUS_EFFECT_UNIQUE
|
|
tick_interval = 4 SECONDS
|
|
alert_type = null
|
|
var/stacks = 0
|
|
/// A reference to the changeling's changeling antag datum.
|
|
var/datum/antagonist/changeling/cling
|
|
|
|
/datum/status_effect/speedlegs/on_apply()
|
|
cling = owner.mind.has_antag_datum(/datum/antagonist/changeling)
|
|
ADD_TRAIT(owner, TRAIT_GOTTAGOFAST, CHANGELING_TRAIT)
|
|
return TRUE
|
|
|
|
/datum/status_effect/speedlegs/tick()
|
|
if(owner.stat || owner.staminaloss >= 90 || cling.chem_charges <= (stacks + 1) * 3)
|
|
to_chat(owner, "<span class='danger'>Our muscles relax without the energy to strengthen them.</span>")
|
|
owner.Weaken(6 SECONDS)
|
|
qdel(src)
|
|
else
|
|
stacks++
|
|
cling.chem_charges -= stacks * 3 //At first the changeling may regenerate chemicals fast enough to nullify fatigue, but it will stack
|
|
if(stacks == 7) //Warning message that the stacks are getting too high
|
|
to_chat(owner, "<span class='warning'>Our legs are really starting to hurt...</span>")
|
|
|
|
/datum/status_effect/speedlegs/before_remove()
|
|
if(stacks < 3 && !(owner.stat || owner.staminaloss >= 90 || cling.chem_charges <= (stacks + 1) * 3)) //We don't want people to turn it on and off fast, however, we need it forced off if the 3 later conditions are met.
|
|
to_chat(owner, "<span class='notice'>Our muscles just tensed up, they will not relax so fast.</span>")
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/datum/status_effect/speedlegs/on_remove()
|
|
REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST, CHANGELING_TRAIT)
|
|
if(!owner.IsWeakened())
|
|
to_chat(owner, "<span class='notice'>Our muscles relax.</span>")
|
|
if(stacks >= 7)
|
|
to_chat(owner, "<span class='danger'>We collapse in exhaustion.</span>")
|
|
owner.Weaken(6 SECONDS)
|
|
owner.emote("gasp")
|
|
cling = null
|
|
|
|
/datum/status_effect/panacea
|
|
duration = 20 SECONDS
|
|
tick_interval = 2 SECONDS
|
|
status_type = STATUS_EFFECT_REFRESH
|
|
alert_type = null
|
|
|
|
/datum/status_effect/panacea/tick()
|
|
owner.adjustToxLoss(-5) //Has the same healing as 20 charcoal, but happens faster
|
|
owner.radiation = max(0, owner.radiation - 70) //Same radiation healing as pentetic
|
|
owner.adjustBrainLoss(-5)
|
|
owner.AdjustDrunk(-12 SECONDS) //50% stronger than antihol
|
|
owner.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 10)
|
|
for(var/datum/reagent/R in owner.reagents.reagent_list)
|
|
if(!R.harmless)
|
|
owner.reagents.remove_reagent(R.id, 2)
|
|
|
|
/datum/status_effect/chainsaw_slaying
|
|
id = "chainsaw_slaying"
|
|
duration = 5 SECONDS
|
|
status_type = STATUS_EFFECT_REFRESH
|
|
alert_type = /obj/screen/alert/status_effect/chainsaw
|
|
|
|
/obj/screen/alert/status_effect/chainsaw
|
|
name = "Revved up!"
|
|
desc = "<span class='danger'>... guts, huge guts! Kill them... must kill them all!</span>"
|
|
icon_state = "chainsaw"
|
|
|
|
/datum/status_effect/chainsaw_slaying/on_apply()
|
|
. = ..()
|
|
if(.)
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.brute_mod *= 0.8
|
|
H.physiology.burn_mod *= 0.8
|
|
H.physiology.stamina_mod *= 0.8
|
|
add_attack_logs(owner, owner, "gained chainsaw stun immunity", ATKLOG_ALL)
|
|
owner.add_stun_absorption("chainsaw", INFINITY, 4)
|
|
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, TRUE, use_reverb = FALSE)
|
|
|
|
/datum/status_effect/chainsaw_slaying/on_remove()
|
|
add_attack_logs(owner, owner, "lost chainsaw stun immunity", ATKLOG_ALL)
|
|
if(islist(owner.stun_absorption) && owner.stun_absorption["chainsaw"])
|
|
owner.remove_stun_absorption("chainsaw")
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.brute_mod /= 0.8
|
|
H.physiology.burn_mod /=0.8
|
|
H.physiology.stamina_mod /= 0.8
|
|
|
|
/datum/status_effect/hope
|
|
id = "hope"
|
|
duration = -1
|
|
tick_interval = 2 SECONDS
|
|
status_type = STATUS_EFFECT_UNIQUE
|
|
alert_type = /obj/screen/alert/status_effect/hope
|
|
|
|
/obj/screen/alert/status_effect/hope
|
|
name = "Hope."
|
|
desc = "A ray of hope beyond dispair."
|
|
icon_state = "hope"
|
|
|
|
/datum/status_effect/hope/tick()
|
|
if(owner.stat == DEAD || owner.health <= HEALTH_THRESHOLD_DEAD) // No dead healing, or healing in dead crit
|
|
return
|
|
if(owner.health > 50)
|
|
if(prob(0.5))
|
|
hope_message()
|
|
return
|
|
var/heal_multiplier = min(3, ((50 - owner.health) / 50 + 1)) // 1 hp at 50 health, 2 at 0, 3 at -50
|
|
owner.adjustBruteLoss(-heal_multiplier * 0.5)
|
|
owner.adjustFireLoss(-heal_multiplier * 0.5)
|
|
owner.adjustOxyLoss(-heal_multiplier)
|
|
if(prob(heal_multiplier * 2))
|
|
hope_message()
|
|
|
|
/datum/status_effect/hope/proc/hope_message()
|
|
var/list/hope_messages = list("You are filled with [pick("hope", "determination", "strength", "peace", "confidence", "robustness")].",
|
|
"Don't give up!",
|
|
"You see your [pick("friends", "family", "coworkers", "self")] [pick("rooting for you", "cheering you on", "worrying about you")].",
|
|
"You can't give up now, keep going!",
|
|
"But you refused to die!",
|
|
"You have been through worse, you can do this!",
|
|
"People need you, do not [pick("give up", "stop", "rest", "pass away", "falter", "lose hope")] yet!",
|
|
"This person is not nearly as robust as you!",
|
|
"You ARE robust, don't let anyone tell you otherwise!",
|
|
"[owner], don't lose hope, the future of the station depends on you!",
|
|
"Do not follow the light yet!")
|
|
var/list/un_hopeful_messages = list("DON'T FUCKING DIE NOW COWARD!",
|
|
"Git Gud, [owner]",
|
|
"I bet a [pick("vox", "vulp", "nian", "tajaran", "baldie")] could do better than you!",
|
|
"You hear people making fun of you for getting robusted.")
|
|
if(prob(99))
|
|
to_chat(owner, "<span class='notice'>[pick(hope_messages)]</span>")
|
|
else
|
|
to_chat(owner, "<span class='cultitalic'>[pick(un_hopeful_messages)]</span>")
|
|
|
|
/datum/status_effect/drill_payback
|
|
duration = -1
|
|
status_type = STATUS_EFFECT_UNIQUE
|
|
alert_type = null
|
|
var/drilled_successfully = FALSE
|
|
var/times_warned = 0
|
|
var/obj/structure/safe/drilled
|
|
|
|
/datum/status_effect/drill_payback/on_creation(mob/living/new_owner, obj/structure/safe/S)
|
|
drilled = S
|
|
return ..()
|
|
|
|
/datum/status_effect/drill_payback/on_apply()
|
|
owner.overlay_fullscreen("payback", /obj/screen/fullscreen/payback, 0)
|
|
addtimer(CALLBACK(src, PROC_REF(payback_phase_2)), 2.7 SECONDS)
|
|
return TRUE
|
|
|
|
/datum/status_effect/drill_payback/proc/payback_phase_2()
|
|
owner.clear_fullscreen("payback")
|
|
owner.overlay_fullscreen("payback", /obj/screen/fullscreen/payback, 1)
|
|
|
|
/datum/status_effect/drill_payback/tick() //They are not staying down. This will be a fight.
|
|
if(!drilled_successfully && (get_dist(owner, drilled) >= 9)) //We don't want someone drilling the safe at arivals then raiding bridge with the buff
|
|
to_chat(owner, "<span class='userdanger'>Get back to the safe, they are going to get the drill!</span>")
|
|
times_warned++
|
|
if(times_warned >= 6)
|
|
owner.remove_status_effect(STATUS_EFFECT_DRILL_PAYBACK)
|
|
return
|
|
if(owner.stat != DEAD)
|
|
owner.adjustBruteLoss(-3)
|
|
owner.adjustFireLoss(-3)
|
|
owner.adjustStaminaLoss(-25)
|
|
|
|
/datum/status_effect/drill_payback/on_remove()
|
|
. = ..()
|
|
owner.clear_fullscreen("payback")
|
|
|
|
/datum/status_effect/thrall_net
|
|
id = "thrall_net"
|
|
tick_interval = 2 SECONDS
|
|
duration = -1
|
|
alert_type = null
|
|
var/blood_cost_per_tick = 5
|
|
var/list/target_UIDs = list()
|
|
var/datum/antagonist/vampire/vamp
|
|
|
|
/datum/status_effect/thrall_net/on_creation(mob/living/new_owner, datum/antagonist/vampire/V, ...)
|
|
. = ..()
|
|
vamp = V
|
|
START_PROCESSING(SSfastprocess, src)
|
|
target_UIDs += owner.UID()
|
|
var/list/view_cache = view(7, owner)
|
|
for(var/datum/mind/M in owner.mind.som.serv)
|
|
if(!M.has_antag_datum(/datum/antagonist/mindslave/thrall))
|
|
continue
|
|
if(!(M.current in view_cache))
|
|
continue
|
|
if(M.current.stat == DEAD)
|
|
continue
|
|
target_UIDs += M.current.UID()
|
|
M.current.Beam(owner, "sendbeam", time = 2 SECONDS, maxdistance = 7)
|
|
|
|
/datum/status_effect/thrall_net/tick()
|
|
var/total_damage = 0
|
|
var/list/view_cache = view(7, owner)
|
|
for(var/uid in target_UIDs)
|
|
var/mob/living/L = locateUID(uid)
|
|
if(!(L in view_cache) || L.stat == DEAD)
|
|
target_UIDs -= uid
|
|
continue
|
|
total_damage += (L.maxHealth - L.health)
|
|
L.Beam(owner, "sendbeam", time = 2 SECONDS, maxdistance = 7)
|
|
|
|
var/average_damage = total_damage / length(target_UIDs)
|
|
|
|
for(var/uid in target_UIDs)
|
|
var/mob/living/L = locateUID(uid)
|
|
var/current_damage = L.maxHealth - L.health
|
|
if(current_damage == average_damage)
|
|
continue
|
|
if(current_damage > average_damage)
|
|
var/heal_amount = current_damage - average_damage
|
|
L.heal_ordered_damage(heal_amount, list(BRUTE, BURN, TOX, OXY, CLONE))
|
|
else
|
|
var/damage_amount = average_damage - current_damage
|
|
L.adjustFireLoss(damage_amount)
|
|
|
|
vamp.bloodusable = max(vamp.bloodusable - blood_cost_per_tick, 0)
|
|
if(!vamp.bloodusable || length(target_UIDs) <= 1) // if there is one left in the list, its only the vampire.
|
|
qdel(src)
|
|
|
|
/datum/status_effect/thrall_net/on_remove()
|
|
. = ..()
|
|
vamp = null
|
|
|
|
/datum/status_effect/rev_protection
|
|
// revs are paralyzed for 10 seconds when they're deconverted, same duration
|
|
duration = 10 SECONDS
|
|
alert_type = null
|
|
|
|
/datum/status_effect/rev_protection/on_apply()
|
|
RegisterSignal(owner, COMSIG_HUMAN_ATTACKED, PROC_REF(on_human_attackby))
|
|
return ..()
|
|
|
|
/datum/status_effect/rev_protection/proc/on_human_attackby(mob/living/carbon/human/victim, mob/living/carbon/human/attacker)
|
|
SIGNAL_HANDLER
|
|
if(!(attacker.a_intent in list(INTENT_DISARM, INTENT_HARM)))
|
|
return
|
|
if(!is_any_revolutionary(attacker)) // protect from non-revs. Revs dont care about deconverted people
|
|
to_chat(attacker, "<span class='biggerdanger'>[owner] was just deconverted! You don't feel like harming them!</span>")
|
|
attacker.changeNext_move(CLICK_CD_MELEE)
|
|
return COMPONENT_CANCEL_ATTACK_CHAIN
|
|
|
|
/datum/status_effect/rev_protection/on_remove()
|
|
UnregisterSignal(owner, COMSIG_HUMAN_ATTACKED)
|
|
. = ..()
|
|
|
|
/datum/status_effect/bookwyrm
|
|
duration = BRAIN_DAMAGE_MOB_TIME
|
|
alert_type = null
|
|
|
|
/datum/status_effect/bearserker_rage
|
|
id = "bearserker rage"
|
|
duration = 5 SECONDS
|
|
status_type = STATUS_EFFECT_REFRESH
|
|
alert_type = /obj/screen/alert/status_effect/bearserker_rage
|
|
|
|
/obj/screen/alert/status_effect/bearserker_rage
|
|
name = "Bearserker Rage"
|
|
desc = "<span class='danger'>Blood flows between your fingers, and Foh'Sie roars; \"MORE BLOOD!\"</span>"
|
|
icon_state = "blood"
|
|
|
|
/datum/status_effect/bearserker_rage/on_apply()
|
|
. = ..()
|
|
if(. && ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.stamina_mod *= 0.75
|
|
H.physiology.heat_mod *= 0.5
|
|
add_attack_logs(owner, owner, "gained bearserker rage resistances", ATKLOG_ALL)
|
|
owner.playsound_local(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, TRUE, use_reverb = FALSE)
|
|
|
|
/datum/status_effect/bearserker_rage/on_remove()
|
|
if(ishuman(owner))
|
|
var/mob/living/carbon/human/H = owner
|
|
H.physiology.stamina_mod /= 0.75
|
|
H.physiology.heat_mod /= 0.5
|
|
add_attack_logs(owner, owner, "lost bearserker rage resistances", ATKLOG_ALL)
|