diff --git a/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/guns.dm b/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/guns.dm
index a87f112ef805..c1a01f274bfd 100644
--- a/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/guns.dm
+++ b/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/guns.dm
@@ -95,5 +95,5 @@
..()
for(var/mob/living/L in view(1, target))
new /obj/effect/temp_visual/fire/fast(get_turf(L))
- L.apply_damage(20, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(20, RED_DAMAGE, firer, attack_type = (ATTACK_TYPE_RANGED))
return BULLET_ACT_HIT
diff --git a/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/weapons.dm b/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/weapons.dm
index f0eb07d54a9f..bbe6f4fb3d12 100644
--- a/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/weapons.dm
+++ b/ModularTegustation/!extra_abnos/joke_abnormalities/!equipment/weapons.dm
@@ -119,7 +119,7 @@
return
if((ishuman(hit_atom)))
var/mob/living/carbon/M = hit_atom
- M.apply_damage(10, STAMINA)
+ M.deal_damage(10, STAMINA, source = throwingdatum.thrower, attack_type = (ATTACK_TYPE_THROWING))
if(prob(75))
M.Paralyze(60)
visible_message(span_danger("[M] barely manages to contain the power of the [src]!"))
@@ -130,7 +130,7 @@
playsound(src, 'sound/abnormalities/crying_children/sorrow_shot.ogg', 45, FALSE, 5)
for(var/mob/living/L in view(1, src))
var/aoe = 50
- L.apply_damage(aoe, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, RED_DAMAGE, throwingdatum.thrower, attack_type = (ATTACK_TYPE_THROWING))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
activated = FALSE
@@ -234,7 +234,7 @@
aoe_damage *= force_multiplier
if(L == user) //This WILL friendly fire there is no escape
continue
- L.apply_damage(aoe_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe_damage, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
to_chat(L, span_userdanger("You are crushed by a monolith!"))
if(L.health < 0)
L.gib()
diff --git a/ModularTegustation/!extra_abnos/joke_abnormalities/aleph/buffdolta.dm b/ModularTegustation/!extra_abnos/joke_abnormalities/aleph/buffdolta.dm
index 620614d1e355..0f6471116e2c 100644
--- a/ModularTegustation/!extra_abnos/joke_abnormalities/aleph/buffdolta.dm
+++ b/ModularTegustation/!extra_abnos/joke_abnormalities/aleph/buffdolta.dm
@@ -163,7 +163,7 @@
onrush_hit |= target
var/turf/thrownat = get_ranged_target_turf_direct(src, target, 15, rand(-30, 30))
target.throw_at(thrownat, 8, 2, src, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = FALSE)
- target.deal_damage(onrush_damage, RED_DAMAGE)
+ target.deal_damage(onrush_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/smash_effect(get_turf(target))
shake_camera(target, 2, 5)
@@ -221,7 +221,7 @@
if(TF.density)
continue
new /obj/effect/temp_visual/small_smoke/halfsecond(TF)
- been_hit = HurtInTurf(TF, been_hit, slam_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE)
+ been_hit = HurtInTurf(TF, been_hit, slam_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in been_hit)
if(L.health < 0)
L.gib()
diff --git a/ModularTegustation/ego_weapons/melee/aleph.dm b/ModularTegustation/ego_weapons/melee/aleph.dm
index ac61b6712c42..ae94b0ecebe3 100644
--- a/ModularTegustation/ego_weapons/melee/aleph.dm
+++ b/ModularTegustation/ego_weapons/melee/aleph.dm
@@ -46,7 +46,7 @@
var/userjust = (get_modified_attribute_level(user, JUSTICE_ATTRIBUTE))
var/justicemod = 1 + userjust / 100
var/damage_dealt = aoe_damage * justicemod * force_multiplier
- user.HurtInTurf(T, list(), damage_dealt, PALE_DAMAGE)
+ user.HurtInTurf(T, list(), damage_dealt, PALE_DAMAGE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
else
hitsound = 'sound/weapons/ego/justitia1.ogg'
user.changeNext_move(CLICK_CD_MELEE * 0.4)
@@ -188,7 +188,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- been_hit = user.HurtInTurf(T, been_hit, aoe, RED_DAMAGE, hurt_mechs = TRUE, hurt_structure = TRUE)
+ been_hit = user.HurtInTurf(T, been_hit, aoe, RED_DAMAGE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE))
/obj/item/ego_weapon/mimicry/get_clamped_volume()
return 40
@@ -432,7 +432,7 @@
for(var/mob/living/L in range(aoe_range, user)) //knocks enemies away from you
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, damtype, null, L.run_armor_check(null, damtype), spread_damage = TRUE)
+ L.deal_damage(aoe, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(firsthit)
aoe = (aoe / 2)
firsthit = FALSE
@@ -569,7 +569,7 @@
continue
else
continue
- L.apply_damage(modified_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(modified_damage, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
/obj/item/ego_weapon/censored/get_clamped_volume()
@@ -741,7 +741,7 @@
var/userjust = (get_modified_attribute_level(user, JUSTICE_ATTRIBUTE))
var/justicemod = 1 + userjust/100
var/damage = force * justicemod * force_multiplier
- target.apply_damage(damage, BLACK_DAMAGE, null, target.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ target.deal_damage(damage, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
if(!canaoe)
return
@@ -764,8 +764,8 @@
for(var/mob/living/L in range(2, start))
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
- L.apply_damage(aoe, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
+ L.deal_damage(aoe, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/space/EgoAttackInfo(mob/user)
if(force_multiplier != 1)
@@ -1019,7 +1019,7 @@
for(var/turf/open/T in range(target_turf, 1))
new /obj/effect/temp_visual/spicebloom(T)
for(var/mob/living/L in T.contents)
- L.apply_damage(modified_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(modified_damage, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
if((L.stat < DEAD) && !(L.status_flags & GODMODE))
damage_dealt += modified_damage
@@ -1133,7 +1133,7 @@
aoe*=justicemod
if(user.faction_check_mob(L) || L == target)
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
/obj/item/ego_weapon/mockery/get_clamped_volume()
@@ -1257,7 +1257,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
/obj/item/ego_weapon/shield/gasharpoon/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
@@ -1320,7 +1320,7 @@
for(var/mob/living/L in view(1, user))
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_COUNTER | ATTACK_TYPE_SPECIAL))
var/datum/status_effect/stacking/pallid_noise/P = L.has_status_effect(/datum/status_effect/stacking/pallid_noise)
if(!P)
L.apply_status_effect(STATUS_EFFECT_PALLIDNOISE)
diff --git a/ModularTegustation/ego_weapons/melee/he.dm b/ModularTegustation/ego_weapons/melee/he.dm
index 0231dfaff251..29b7802d3793 100644
--- a/ModularTegustation/ego_weapons/melee/he.dm
+++ b/ModularTegustation/ego_weapons/melee/he.dm
@@ -23,7 +23,7 @@
var/justicemod = 1 + userjust / 100
var/damage_dealt = force * justicemod * force_multiplier
var/list/been_hit = QDELETED(target) ? list() : list(target)
- user.HurtInTurf(T, been_hit, damage_dealt, RED_DAMAGE, hurt_mechs = TRUE, hurt_structure = TRUE)
+ user.HurtInTurf(T, been_hit, damage_dealt, RED_DAMAGE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE))
/obj/item/ego_weapon/grinder/get_clamped_volume()
return 40
@@ -76,7 +76,7 @@
aoe*=justicemod
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/fury
@@ -369,7 +369,7 @@
new /obj/effect/temp_visual/smash_effect(T)
var/smash_damage = (i > 2 ? 22 : 6)*(1+(get_modified_attribute_level(user, JUSTICE_ATTRIBUTE)/100))
smash_damage*=force_multiplier
- been_hit = user.HurtInTurf(T, been_hit, smash_damage, RED_DAMAGE)
+ been_hit = user.HurtInTurf(T, been_hit, smash_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if (i > 2)
playsound(get_turf(src), 'sound/abnormalities/woodsman/woodsman_strong.ogg', 75, 0, 5) // BAM
else
@@ -863,7 +863,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
icon_state = "impending_day_extended"
sacrifice = TRUE
@@ -953,7 +953,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(get_turf(L))
FX.color = "#b52e19"
@@ -1239,7 +1239,7 @@
continue
playsound(T, 'sound/weapons/fixer/generic/blade3.ogg', 30, TRUE, 3)
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = user.HurtInTurf(T, been_hit, punishment_damage, PALE_DAMAGE, check_faction = TRUE)
+ been_hit = user.HurtInTurf(T, been_hit, punishment_damage, PALE_DAMAGE, check_faction = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/destiny
name = "destiny"
@@ -1398,7 +1398,7 @@
/obj/item/ego_weapon/aedd/proc/power_attack(mob/living/target, mob/living/user)
var/userjust = (get_modified_attribute_level(user, JUSTICE_ATTRIBUTE))
var/justicemod = 1 + userjust/100
- target.apply_damage((force * justicemod), BLACK_DAMAGE, null, target.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ target.deal_damage((force * justicemod), BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
playsound(src, 'sound/abnormalities/thunderbird/tbird_charge.ogg', 50, TRUE)
var/turf/T = get_turf(target)
new /obj/effect/temp_visual/justitia_effect(T)
@@ -1469,7 +1469,7 @@
for(var/turf/T in view(1, target))
var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(T)
FX.color = "#622F22"
- user.HurtInTurf(T, list(), 16, BLACK_DAMAGE, check_faction = TRUE)
+ user.HurtInTurf(T, list(), 16, BLACK_DAMAGE, check_faction = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
return
@@ -1668,7 +1668,7 @@
qdel(src)
return
- owner.apply_damage(damage_amount, RED_DAMAGE, null, owner.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ owner.deal_damage(damage_amount, RED_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
playsound(owner, 'sound/abnormalities/mountain/bite.ogg', 40, TRUE) //yes im reusing a sound bite me
new /obj/effect/temp_visual/beakbite(get_turf(owner))
@@ -1973,7 +1973,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- been_hit = user.HurtInTurf(T2, been_hit, aoe, RED_DAMAGE, hurt_mechs = TRUE, hurt_structure = TRUE)
+ been_hit = user.HurtInTurf(T2, been_hit, aoe, RED_DAMAGE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE))
var/atom/throw_target = get_edge_target_turf(L, get_dir(L, get_step_towards(L, get_turf(user))))
if(!L.anchored)
L.throw_at(throw_target, 1, get_dist(user, L) - 1, user)
@@ -2118,7 +2118,7 @@
var/mob/living/carbon/human/H = L
if(!H.sanity_lost)
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
L.visible_message(span_danger("[user] sears [L] with the [src]!"))
return
addtimer(CALLBACK(src, PROC_REF(Leap), user, dir, leap_range), 0.1)
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/black_silence.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/black_silence.dm
index 4832ed82d8bc..e531be0b9842 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/black_silence.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/black_silence.dm
@@ -262,7 +262,7 @@
var/mob/living/L = target
var/turf/F = get_turf(L)
new /obj/effect/temp_visual/smash_effect(F)
- L.apply_damage(40, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(40, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
exchange_cooldown -= 20
switch(dash_count)
if(0)
@@ -456,7 +456,7 @@
playsound(T, 'sound/weapons/black_silence/longsword_atk.ogg', 50, 1)
for (var/i = 0; i < 3; i++)
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/L in user.HurtInTurf(T, list(), 25, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in user.HurtInTurf(T, list(), 25, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
exchange_cooldown -= 10
sleep(0.25 SECONDS)
@@ -745,12 +745,12 @@
dash(user, target_turf)
playsound(user, 'sound/weapons/black_silence/duelsword.ogg', 50, 1)
if(dash_count < 1)
- L.apply_damage(30, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(30, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
addtimer(CALLBACK(src, PROC_REF(dash_attack), user, target), 5)
new /obj/effect/temp_visual/smash_effect(F)
dash_count += 1
else
- L.apply_damage(50, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(50, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/smash_effect(F)
exchange_cooldown -= 30
dash_count = 0
@@ -878,7 +878,7 @@
var/list/been_hit = list()
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/smash_effect(T)
- var/list/new_hits = user.HurtInTurf(T, been_hit, 150, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE) - been_hit
+ var/list/new_hits = user.HurtInTurf(T, been_hit, 150, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
var/atom/throw_target = get_edge_target_turf(target, get_dir(user, L))
@@ -1029,7 +1029,7 @@
new /obj/effect/temp_visual/smash_effect(T)
if(!target.anchored)
target.Move(target_turf)
- L.apply_damage(750, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE)) //this went on for 5 sec, so 150 DPS as the final attack
+ L.deal_damage(750, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL)) //this went on for 5 sec, so 150 DPS as the final attack
sleep(10)
furioso_end(user, target)
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/blue_sicko.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/blue_sicko.dm
index a1680b795d6e..1cc0345f7d01 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/blue_sicko.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/blue_sicko.dm
@@ -219,7 +219,7 @@
damage *= 1.5
if(isanimal(L))
damage *= 1.5
- L.apply_damage(damage, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE))
+ L.deal_damage(damage, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
to_chat(L, span_userdanger("[user] eviscerates you!"), MESSAGE_TYPE_COMBAT)
to_chat(user, span_warning("You eviscerate [L]!"), MESSAGE_TYPE_COMBAT)
active = FALSE
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/cane.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/cane.dm
index 556d962717c8..a4fa21c647c2 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/cane.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/cane.dm
@@ -127,5 +127,5 @@
var/mob/living/carbon/human/H = L
if(!H.sanity_lost)
continue
- L.apply_damage(10, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(10, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/dawn.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/dawn.dm
index 68eaef0c3dd0..d0fd4fafe699 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/dawn.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/dawn.dm
@@ -34,7 +34,7 @@
for(var/turf/T in view(aoe_range, target))
if(prob(30))
new /obj/effect/temp_visual/fire/fast(T)
- user.HurtInTurf(T, list(), force*0.2, damtype, hurt_mechs = TRUE)
+ user.HurtInTurf(T, list(), force*0.2, damtype, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
aoe_target = target
//Philip's Sword
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/devyat.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/devyat.dm
index 864a9347cb38..ca952469e615 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/devyat.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/devyat.dm
@@ -91,7 +91,7 @@
var/mob/living/carbon/human/theif = user
say("You are touching a devyat trunk without the correct access, please step away.")
playsound(get_turf(src), 'sound/weapons/ego/devyat_overclock.ogg', 25, 0, 4)
- theif.apply_damage(theif_damage, BLACK_DAMAGE)
+ theif.deal_damage(theif_damage, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
return FALSE
. = ..()
@@ -151,7 +151,7 @@
var/mob/living/carbon/human/theif = who
say("You are touching a devyat trunk without the correct access, please step away.")
playsound(get_turf(src), 'sound/weapons/ego/devyat_overclock.ogg', 25, 0, 4)
- theif.apply_damage(theif_damage, BLACK_DAMAGE)
+ theif.deal_damage(theif_damage, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
return FALSE
return ..()
@@ -243,7 +243,7 @@
/obj/item/ego_weapon/city/devyat_trunk/proc/gain_courier_trunk(amount, mob/living/user)
if(overclock)
- user.apply_damage(courier_trunk * overclock_mult, BLACK_DAMAGE)
+ user.deal_damage(courier_trunk * overclock_mult, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
if(user.stat == DEAD)
playsound(get_turf(user), 'sound/weapons/ego/devyat_overclock_death.ogg', 50, 0, 4)
end_combat()
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/lcorp_melee.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/lcorp_melee.dm
index 1ec117bcdf4c..23fc0051427f 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/lcorp_melee.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/lcorp_melee.dm
@@ -302,7 +302,7 @@
for(var/mob/living/L in T) //knocks enemies away from you
if(L == user || ishuman(L))
continue
- L.apply_damage(shockwave_damage[current_level] * force_multiplier, damtype, null, L.run_armor_check(null, damtype), spread_damage = TRUE)
+ L.deal_damage(shockwave_damage[current_level] * force_multiplier, damtype, src, attack_type = (ATTACK_TYPE_SPECIAL))
var/throw_target = get_edge_target_turf(L, get_dir(L, get_step_away(L, start)))
if(!L.anchored)
var/whack_speed = 10
@@ -696,12 +696,12 @@
to_chat(user, "You hit yourself over the head!")
user.Paralyze(knockdown_time_carbon * force)
- user.apply_damage(stamina_damage, STAMINA, BODY_ZONE_HEAD)
+ user.deal_damage(stamina_damage, STAMINA, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = BODY_ZONE_HEAD)
additional_effects_carbon(user) // user is the target here
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
+ H.deal_damage(2*force, BRUTE, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = BODY_ZONE_HEAD)
else
user.take_bodypart_damage(2*force)
return
@@ -759,11 +759,11 @@
target.Knockdown(knockdown_time_carbon * armor_effect)
log_combat(user, target, "tripped", src)
target.visible_message(desc["visibletrip"], desc["localtrip"])
- target.apply_damage(stamina_damage*0.25, STAMINA, selected_bodypart_area, def_check)
+ target.deal_damage(stamina_damage*0.25, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = selected_bodypart_area, blocked = def_check)
else
log_combat(user, target, "stunned", src)
target.visible_message(desc["visiblestun"], desc["localstun"])
- target.apply_damage(stamina_damage, STAMINA, selected_bodypart_area, def_check)
+ target.deal_damage(stamina_damage, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = selected_bodypart_area, blocked = def_check)
if(BODY_ZONE_L_ARM)
baton_disarm(user, target, LEFT_HANDS, selected_bodypart_area, def_check)
@@ -772,7 +772,7 @@
baton_disarm(user, target, RIGHT_HANDS, selected_bodypart_area, def_check)
else // Normal effect.
- target.apply_damage(stamina_damage, STAMINA, selected_bodypart_area, def_check)
+ target.deal_damage(stamina_damage, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = selected_bodypart_area, blocked = def_check)
log_combat(user, target, "stunned", src)
target.visible_message(desc["visiblestun"], desc["localstun"])
@@ -794,8 +794,8 @@
if(I && target.dropItemToGround(I)) // There is an item in this hand. Drop it and deal slightly less stamina damage.
log_combat(user, target, "disarmed", src)
target.visible_message(desc["visibledisarm"], desc["localdisarm"])
- target.apply_damage(stamina_damage*0.5, STAMINA, bodypart_target, def_check)
+ target.deal_damage(stamina_damage*0.5, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = bodypart_target, blocked = def_check)
else // No item in that hand. Deal normal stamina damage.
log_combat(user, target, "stunned", src)
target.visible_message(desc["visiblestun"], desc["localstun"])
- target.apply_damage(stamina_damage, STAMINA, bodypart_target, def_check)
+ target.deal_damage(stamina_damage, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = bodypart_target, blocked = def_check)
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/liu.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/liu.dm
index 3d77adfc9118..1194dc655bcd 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/liu.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/liu.dm
@@ -225,7 +225,7 @@
for(var/mob/living/L in T)
if(L == user)
continue
- L.apply_damage(force*0.5, damtype, null, L.run_armor_check(null, damtype), spread_damage = TRUE)
+ L.deal_damage(force*0.5, damtype, user, attack_type = (ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/city/liu/fist/proc/hopback(mob/living/carbon/user)
var/dodgelanding
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/mirae.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/mirae.dm
index 467e113db075..db7676b9ac16 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/mirae.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/mirae.dm
@@ -24,7 +24,7 @@
return
if(target.stat != DEAD)
living = TRUE
- target.apply_damage(force*0.2, PALE_DAMAGE, null, target.run_armor_check(null, PALE_DAMAGE), spread_damage = TRUE)
+ target.deal_damage(force*0.2, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
..()
if(target.stat == DEAD && living)
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/ncorp.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/ncorp.dm
index 5660f07b436d..75b4571ab292 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/ncorp.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/ncorp.dm
@@ -60,7 +60,7 @@
for(var/mob/living/M in marked)
playsound(M, 'sound/weapons/fixer/generic/nail2.ogg', 100, FALSE, 4)
- M.apply_damage(I.force, I.damtype, null, M.run_armor_check(null, I.damtype), spread_damage = TRUE, white_healable = TRUE)
+ M.deal_damage(I.force, I.damtype, user, flags = (DAMAGE_WHITE_HEALABLE), attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/remorse(get_turf(M))
marked -= M
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/rats.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/rats.dm
index 14643a04ce35..942cc5b4e3b1 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/rats.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/rats.dm
@@ -91,7 +91,7 @@
return ..()
if(prob(50))
to_chat(user,span_warning("You pinch your fingers in the weapon."))
- user.apply_damage(2, RED_DAMAGE, null, user.run_armor_check(null, RED_DAMAGE))
+ user.deal_damage(2, RED_DAMAGE, flags = (DAMAGE_FORCED))
return FALSE
return ..()
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/rcorp.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/rcorp.dm
index 52ceeac2ebcc..846bccaf8c2d 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/rcorp.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/rcorp.dm
@@ -135,7 +135,7 @@
playsound(target_turf, 'sound/weapons/pulse.ogg', 50, TRUE)
for(var/turf/open/T in range(target_turf, 0))
new /obj/effect/temp_visual/smash1(T)
- user.HurtInTurf(T, list(), force, BLACK_DAMAGE)
+ user.HurtInTurf(T, list(), force, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/city/reindeer/captain
name = "R-corp reindeer captain staff"
@@ -318,7 +318,7 @@
var/targetfound
playsound(target_turf, 'sound/weapons/rapierhit.ogg', 100, TRUE)
- if(LAZYLEN(user.HurtInTurf(target_turf, list(), force*2, PALE_DAMAGE)))
+ if(LAZYLEN(user.HurtInTurf(target_turf, list(), force*2, PALE_DAMAGE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))))
targetfound = TRUE
//So you can't fucking teleport into a place where you are immune to all damage
if(!targetfound)
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/rosespanner.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/rosespanner.dm
index fc5eed991e1c..b0399e2e5de0 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/rosespanner.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/rosespanner.dm
@@ -44,7 +44,7 @@
/obj/item/ego_weapon/city/rosespanner/ChargeAttack(mob/living/target, mob/living/user)
. = ..()
- target.apply_damage(force, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(force, damtype, user, attack_type = (ATTACK_TYPE_SPECIAL))
if(overcharged)
to_chat(user, span_danger("You overcharged your weapon!."))
@@ -55,7 +55,7 @@
for(var/mob/living/L in T)
if(!overcharged && (L == user || ishuman(L)))
continue
- L.apply_damage(aoe, damtype, null, L.run_armor_check(null, damtype), spread_damage = TRUE)
+ L.deal_damage(aoe, damtype, user, attack_type = (ATTACK_TYPE_SPECIAL))
overcharged = FALSE
charged = FALSE
@@ -141,4 +141,3 @@
name = "rosespanner pale gear"
icon_state = "palegear"
damtype = PALE_DAMAGE
-
diff --git a/ModularTegustation/ego_weapons/melee/non_abnormality/wcorp.dm b/ModularTegustation/ego_weapons/melee/non_abnormality/wcorp.dm
index b020a73221ff..8fe25d987ce9 100644
--- a/ModularTegustation/ego_weapons/melee/non_abnormality/wcorp.dm
+++ b/ModularTegustation/ego_weapons/melee/non_abnormality/wcorp.dm
@@ -16,7 +16,7 @@
/obj/item/ego_weapon/city/wcorp/ChargeAttack(mob/living/target, mob/living/user)
. = ..()
- target.apply_damage(force, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(force, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
//Non-baton Wcorp is Grade 5
/obj/item/ego_weapon/city/wcorp/fist
@@ -69,7 +69,7 @@
/obj/item/ego_weapon/city/wcorp/axe/ChargeAttack(mob/living/target, mob/living/user)
. = ..()
sleep(0.5 SECONDS)
- target.apply_damage(force*3, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(force*3, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
user.changeNext_move(CLICK_CD_MELEE * 6)
/obj/item/ego_weapon/city/wcorp/spear
@@ -98,13 +98,13 @@
. = ..()
sleep(0.2 SECONDS)
for(var/mob/living/L in range(1, src))
- var/aoe = 25
+ var/aoe = 15
var/userjust = (get_attribute_level(user, JUSTICE_ATTRIBUTE))
var/justicemod = 1 + userjust/100
aoe*=justicemod
if(L == user || ishuman(L))
continue
- L.apply_damage(force, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
user.changeNext_move(CLICK_CD_MELEE * 3)
@@ -136,7 +136,7 @@
sleep(0.2 SECONDS)
for(var/i = 1 to 3)
sleep(0.2 SECONDS)
- target.apply_damage(force, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(force, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(src, 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, TRUE)
var/turf/T = get_turf(target)
new /obj/effect/temp_visual/justitia_effect(T)
@@ -174,7 +174,7 @@
/obj/item/ego_weapon/city/wcorp/hatchet/ChargeAttack(mob/living/target, mob/living/user)
. = ..()
sleep(0.2 SECONDS)
- target.apply_damage(force*2, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(force*2, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
target.apply_status_effect(/datum/status_effect/qliphothoverload)
/obj/item/ego_weapon/city/wcorp/hammer
@@ -200,7 +200,7 @@
/obj/item/ego_weapon/city/wcorp/hammer/ChargeAttack(mob/living/target, mob/living/user)
. = ..()
sleep(0.5 SECONDS)
- target.apply_damage(force*2, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(force*2, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
target.apply_status_effect(/datum/status_effect/display/rend/black/w_corp)
playsound(src, 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, TRUE)
new /obj/effect/temp_visual/justitia_effect(get_turf(target))
diff --git a/ModularTegustation/ego_weapons/melee/ordeal.dm b/ModularTegustation/ego_weapons/melee/ordeal.dm
index 69f0fee173b6..7e05c9b535fb 100644
--- a/ModularTegustation/ego_weapons/melee/ordeal.dm
+++ b/ModularTegustation/ego_weapons/melee/ordeal.dm
@@ -180,7 +180,7 @@
visible_message(span_boldwarning("[user] claws through [L]!"))
playsound(L, 'ModularTegustation/Tegusounds/claw/stab.ogg', 25, 1)
new /obj/effect/temp_visual/cleave(get_turf(L))
- L.apply_damage(justicemod*60, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(justicemod*60, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
dash_charges--
if(dash_charges == 0)
special_attack = FALSE
@@ -250,7 +250,7 @@
if(AA == target)
continue
to_chat(AA, span_userdanger("[user] slashes you!"))
- AA.apply_damage(justicemod*50, BLACK_DAMAGE, null, AA.run_armor_check(null, BLACK_DAMAGE))
+ AA.deal_damage(justicemod*50, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/cleave(get_turf(AA))
for(var/obj/item/I in get_turf(target))
if(I.anchored)
@@ -276,7 +276,7 @@
if(AA == target)
continue
to_chat(AA, span_userdanger("You start gushing blood!"))
- AA.apply_damage(justicemod*60, BLACK_DAMAGE, null, AA.run_armor_check(null, BLACK_DAMAGE)) // Shouldn't have gotten close.
+ AA.deal_damage(justicemod*60, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) // Shouldn't have gotten close.
new /obj/effect/temp_visual/cleave(get_turf(AA))
user.AdjustStun(-60 SECONDS, ignore_canstun = TRUE)
target.AdjustStun(-60 SECONDS, ignore_canstun = TRUE)
@@ -285,7 +285,7 @@
span_warning("[target] suddenly gushes blood!"),
span_userdanger("As [user] lets go, you start gushing blood!")
)
- target.apply_damage(justicemod*150, BLACK_DAMAGE, null, target.run_armor_check(null, BLACK_DAMAGE)) // 150 so that it can scale form justice to about 300
+ target.deal_damage(justicemod*150, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) // 150 so that it can scale form justice to about 300
for(var/turf/T in range(1, target))
if(prob(35))
var/obj/effect/decal/cleanable/blood/B = new /obj/effect/decal/cleanable/blood(get_turf(target))
@@ -322,7 +322,7 @@
user.forceMove(tp_loc)
to_chat(L, span_userdanger("[user] decimates you!"))
playsound(L, 'ModularTegustation/Tegusounds/claw/eviscerate2.ogg', 100, 1)
- L.apply_damage(justicemod*60, PALE_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(justicemod*60, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL), blocked = L.run_armor_check(null, BLACK_DAMAGE))
prev_loc.Beam(tp_loc, "bsa_beam", time=25)
new /obj/effect/temp_visual/cleave(get_turf(L))
sleep(3)
diff --git a/ModularTegustation/ego_weapons/melee/special.dm b/ModularTegustation/ego_weapons/melee/special.dm
index 63215e4180ab..8ca73ac928df 100644
--- a/ModularTegustation/ego_weapons/melee/special.dm
+++ b/ModularTegustation/ego_weapons/melee/special.dm
@@ -127,7 +127,7 @@
if(get_open_turf_in_dir(target_turf, dir))
new /obj/effect/temp_visual/paradise_attack_large/right(get_step(target_turf,dir))
for(var/turf/open/T in range(target_turf, 1))
- for(var/mob/living/L in user.HurtInTurf(T, been_hit, modified_damage, PALE_DAMAGE, hurt_mechs = TRUE) - been_hit)
+ for(var/mob/living/L in user.HurtInTurf(T, been_hit, modified_damage, PALE_DAMAGE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL)) - been_hit)
been_hit += L
if((L.stat < DEAD) && !(L.status_flags & GODMODE))
healing_amount += healing
@@ -143,7 +143,7 @@
enemies += 1
if((L.stat < DEAD) && !(L.status_flags & GODMODE))
healing_amount += healing
- L.apply_damage(modified_damage, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(modified_damage, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/paradise_attack(get_turf(L))
if(healing_amount > 0)
var/mob/living/carbon/human/H = user
@@ -295,10 +295,10 @@
/obj/item/ego_weapon/shield/distortion
name = "distortion"
desc = "The fragile human mind is fated to twist and distort."
- special = "This weapon requires two hands to use and always blocks ranged attacks."
+ special = "This weapon requires two hands to use and always blocks ranged attacks. The first time blocking a non ranged attack results in 1 of 15 random effects."
icon_state = "distortion"
force = 20 //Twilight but lower in terms of damage
- attack_speed = 1.8
+ attack_speed = 2
damtype = RED_DAMAGE
knockback = KNOCKBACK_MEDIUM
attack_verb_continuous = list("pulverizes", "bashes", "slams", "blockades")
@@ -317,6 +317,8 @@
)
attacking = TRUE //ALWAYS blocking ranged attacks
+ var/chaos = TRUE
+
/obj/item/ego_weapon/shield/distortion/Initialize()
. = ..()
@@ -340,11 +342,100 @@
to_chat(user, span_notice("You cannot use [src] with only one hand!"))
return FALSE
-/obj/item/ego_weapon/shield/distortion/AnnounceBlock(mob/living/carbon/human/source, damage, damagetype, def_zone)
+/obj/item/ego_weapon/shield/distortion/AnnounceBlock(mob/living/carbon/human/source, damage, damagetype, def_zone, mob/attacker, damage_flags, attack_type)
if(src != source.get_active_held_item() || !CanUseEgo(source))
DisableBlock(source)
return
..()
+ if(damage <= 0 || source == attacker || !isliving(attacker) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
+ return
+ if(!(attacker in livinginview(8, source)))
+ return
+ if(!chaos)
+ return
+ chaos = FALSE
+ var/roll = rand(1,34)
+ INVOKE_ASYNC(src, PROC_REF(ChaosShield), source, attacker, roll)
+ if(roll == 13 || roll == 14)//Done here to nullify the damage taken
+ to_chat(source,span_nicegreen("Your [src] fully nullified the attack!"))
+ return COMPONENT_MOB_DENY_DAMAGE
+
+
+/obj/item/ego_weapon/shield/distortion/proc/ChaosShield(mob/living/carbon/human/user, mob/living/attacker, roll)
+ playsound(get_turf(user), 'sound/weapons/black_silence/snap.ogg', 50)
+ switch(roll)
+ if(1, 2)
+ user.adjustBruteLoss(-8)
+ if(3, 4)
+ user.adjustSanityLoss(-8)
+ if(5, 6)
+ user.adjustBruteLoss(-5)
+ user.adjustSanityLoss(-5)
+ if(7, 8)
+ user.apply_shield(/datum/status_effect/interventionshield, shield_health = 50, shield_duration = 15 SECONDS)
+ if(9, 10)
+ user.apply_shield(/datum/status_effect/interventionshield/white, shield_health = 50, shield_duration = 15 SECONDS)
+ if(11, 12)
+ user.apply_shield(/datum/status_effect/interventionshield/black, shield_health = 50, shield_duration = 15 SECONDS)
+ if(15, 16)
+ user.apply_shield(/datum/status_effect/interventionshield/pale, shield_health = 50, shield_duration = 15 SECONDS)
+ if(17, 18)
+ var/turf/proj_turf = user.loc
+ if(!isturf(proj_turf))
+ return
+ var/obj/projectile/ego_bullet/swan/S = new /obj/projectile/ego_bullet/swan(proj_turf)
+ S.fired_from = src //for signal check
+ playsound(user, 'sound/weapons/resonator_blast.ogg', 30, TRUE)
+ S.firer = user
+ S.preparePixelProjectile(attacker, user)
+ S.fire()
+ S.damage *= force_multiplier * 3
+ if(19, 20)
+ user.visible_message(span_danger("[user]'s [src] screaches!"), \
+ span_userdanger("Your [src] screaches!"), vision_distance = COMBAT_MESSAGE_RANGE, ignored_mobs = user)
+ playsound(user, "sound/abnormalities/distortedform/screech4.ogg", 75, FALSE, 8)
+ new /obj/effect/temp_visual/fragment_song(get_turf(src))
+ for(var/mob/living/L in ohearers(8, src))
+ if(L.z != z || (L.status_flags & GODMODE))
+ continue
+ if(user.faction_check_mob(L, FALSE))
+ continue
+ if(L.stat == DEAD)
+ continue
+ L.deal_damage(30, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
+ if(21)
+ user.visible_message(span_danger("[user]'s [src] explodes!"), \
+ span_userdanger("Your [src] explodes!"), ignored_mobs = user)
+ for(var/mob/living/L in view(1, user))
+ if(user.faction_check_mob(L))
+ continue
+ L.deal_damage(80, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
+ new /obj/effect/explosion(get_turf(user))
+ if(22)
+ to_chat(user,span_nicegreen("Your [src] creates some soothing music."))
+ playsound(user, 'sound/abnormalities/siren/sirenhappy.ogg', 100, FALSE, 10)
+ for(var/mob/living/carbon/human/H in orange(10, src))
+ if(user.faction_check_mob(H, FALSE))
+ if(H != user)
+ to_chat(H,span_nicegreen("You hear some soothing music."))
+ H.adjustSanityLoss(-12)
+ if(23)
+ //First we spawn a timestop affect, freezing the area around the attacker, for 5 seconds
+ new /obj/effect/timestop(get_turf(attacker), 5, 5 SECONDS, list(user))
+ if(24)
+ playsound(get_turf(attacker), 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, FALSE, -3)
+ for(var/mob/living/L in get_turf(attacker))
+ if(user.faction_check_mob(L, FALSE))
+ continue
+ if(L.stat == DEAD)
+ continue
+ L.deal_damage(200, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
+ new /obj/effect/temp_visual/beam_in(get_turf(src))
+ if(25)
+ for(var/mob/living/carbon/human/L in livinginview(8, user))
+ if((!ishuman(L)) || L.stat == DEAD)
+ continue
+ L.apply_shield(/datum/status_effect/interventionshield/perfect, shield_health = 50, shield_duration = 15 SECONDS)
/obj/item/ego_weapon/shield/distortion/DisableBlock(mob/living/carbon/human/user)
if(!block)
@@ -359,6 +450,10 @@
return
..()
+/obj/item/ego_weapon/shield/distortion/DisableBlock(mob/living/carbon/human/user)
+ . = ..()
+ chaos = TRUE
+
/obj/item/ego_weapon/shield/distortion/DropStance() //ALWAYS blocking ranged attacks, NEVER drop your stance!
return
@@ -459,7 +554,7 @@
if("sword")
var/red = force
red*=justicemod
- target.apply_damage(red * force_multiplier, RED_DAMAGE, null, target.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ target.deal_damage(red * force_multiplier, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
if("whip")
var/multihit = force
@@ -478,7 +573,7 @@
aoe*=justicemod
if(user.faction_check_mob(L))
continue
- L.apply_damage(aoe * force_multiplier, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe * force_multiplier, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
if(!ishuman(L))
if(!L.has_status_effect(/datum/status_effect/display/rend/black))
@@ -517,7 +612,7 @@
for(var/mob/living/L in T)
if(user.faction_check_mob(L))
continue
- L.apply_damage(smash_damage * force_multiplier, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(smash_damage * force_multiplier, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(user, 'sound/abnormalities/fairy_longlegs/attack.ogg', 75, 0, 3)
sleep(0.5 SECONDS)
smashing = FALSE
@@ -875,7 +970,7 @@
if(L in been_hit)
continue
been_hit += L
- L.apply_damage(aoe, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
var/throw_target = get_edge_target_turf(L, dir)
var/whack_speed = (prob(60) ? 2 : 4)
L.throw_at(throw_target, rand(2, 4), whack_speed, user)
diff --git a/ModularTegustation/ego_weapons/melee/teth.dm b/ModularTegustation/ego_weapons/melee/teth.dm
index 0eb24ed27d9c..7c8d188a90d6 100644
--- a/ModularTegustation/ego_weapons/melee/teth.dm
+++ b/ModularTegustation/ego_weapons/melee/teth.dm
@@ -262,7 +262,7 @@
var/damage_dealt = 0
for(var/turf/open/T in range(target_turf, 0))
new /obj/effect/temp_visual/smash1(T)
- for(var/mob/living/L in user.HurtInTurf(T, list(), ranged_damage, BLACK_DAMAGE, hurt_mechs = TRUE))
+ for(var/mob/living/L in user.HurtInTurf(T, list(), ranged_damage, BLACK_DAMAGE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
if((L.stat < DEAD) && !(L.status_flags & GODMODE))
damage_dealt += ranged_damage
@@ -376,7 +376,7 @@
playsound(T, 'sound/effects/ordeals/amber/midnight_out.ogg', 40,TRUE)
for(var/turf/open/T2 in RANGE_TURFS(range, src))
new /obj/effect/temp_visual/yellowsmoke(T2)
- for(var/mob/living/L in creator.HurtInTurf(T2, list(), resonance_damage * damage_multiplier, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in creator.HurtInTurf(T2, list(), resonance_damage * damage_multiplier, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, flags = (DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_ENVIRONMENT)))
to_chat(L, span_userdanger("[src] bites you!"))
if(creator)
creator.visible_message(span_danger("[creator] activates [src] on [L]!"),span_danger("You activate [src] on [L]!"), null, COMBAT_MESSAGE_RANGE, L)
diff --git a/ModularTegustation/ego_weapons/melee/waw.dm b/ModularTegustation/ego_weapons/melee/waw.dm
index eaa0bc9e1724..b6dd9600eb3a 100644
--- a/ModularTegustation/ego_weapons/melee/waw.dm
+++ b/ModularTegustation/ego_weapons/melee/waw.dm
@@ -29,7 +29,7 @@
for(var/mob/living/L in hearers(1, target_turf))
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
@@ -198,7 +198,7 @@
if(mode)
if(M in targets)
playsound(M, 'sound/weapons/fixer/generic/nail1.ogg', 100, FALSE, 4)
- M.apply_damage(ranged_damage, WHITE_DAMAGE, null, M.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ M.deal_damage(ranged_damage, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/remorse(get_turf(M))
targets -= M
..()
@@ -320,7 +320,7 @@
if(special_checks_faction && user.faction_check_mob(L))
continue
to_chat(L, span_userdanger("You are hit by [src]!"))
- L.apply_damage(dealing_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(dealing_damage, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_THROWING))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
dealing_damage = max(dealing_damage * 0.9, special_damage * 0.3)
@@ -421,7 +421,7 @@
if(user.faction_check_mob(C) && !vine_damage_bonus)
continue
new /obj/effect/temp_visual/vinespike(get_turf(C))
- C.apply_damage(vine_damage + vine_damage_bonus, BLACK_DAMAGE, null, C.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ C.deal_damage(vine_damage + vine_damage_bonus, BLACK_DAMAGE, user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
affected_mobs += 1
playsound(loc, 'sound/creatures/venus_trap_hurt.ogg', min(75, affected_mobs * 15), TRUE, round( affected_mobs * 0.5))
AlterMoveResist(user, 0.4)
@@ -477,7 +477,7 @@
playsound(target_turf, 'sound/abnormalities/ebonyqueen/attack.ogg', 50, TRUE)
for(var/turf/open/T in RANGE_TURFS(1, target_turf))
new /obj/effect/temp_visual/thornspike(T)
- user.HurtInTurf(T, list(), damage_dealt, BLACK_DAMAGE, hurt_mechs = TRUE)
+ user.HurtInTurf(T, list(), damage_dealt, BLACK_DAMAGE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/wings // Is this overcomplicated? Yes. But I'm finally happy with what I want to make of this weapon.
name = "torn off wings"
@@ -585,7 +585,7 @@
var/mob/living/carbon/human/H = L
if(!H.sanity_lost)
continue
- L.apply_damage(aoe, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
L.visible_message(span_danger("[user] slices [L]!"))
/obj/item/ego_weapon/wings/proc/Leap(mob/living/user, dir = SOUTH, times_ran = 3)
@@ -613,7 +613,7 @@
var/mob/living/carbon/human/H = L
if(!H.sanity_lost)
continue
- L.apply_damage(aoe, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
L.visible_message(span_danger("[user] evicerates [L]!"))
return
for(var/turf/T in orange(1, user))
@@ -817,33 +817,30 @@
user.update_inv_hands()
return
-/obj/item/ego_weapon/shield/swan/AnnounceBlock(mob/living/carbon/human/source, damage, damagetype, def_zone)
+/obj/item/ego_weapon/shield/swan/AnnounceBlock(mob/living/carbon/human/source, damage, damagetype, def_zone, mob/attacker, damage_flags, attack_type)
. = ..()
- INVOKE_ASYNC(src, PROC_REF(Reflect), source, damage)
+ if(damage <= 0 || source == attacker || !isliving(attacker) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
+ return
+ if(!(attacker in livinginview(8, source)))
+ return
+ INVOKE_ASYNC(src, PROC_REF(Reflect), source, attacker)
-/obj/item/ego_weapon/shield/swan/proc/Reflect(mob/living/carbon/human/user, damage, damagetype, def_zone)
+/obj/item/ego_weapon/shield/swan/proc/Reflect(mob/living/carbon/human/user, mob/living/attacker)
if(!block)
return
if(reflect_cooldown > world.time)
return
- reflect_cooldown = world.time + reflect_cooldown_time
var/turf/proj_turf = user.loc
if(!isturf(proj_turf))
return
- var/list/mob_list = list()
- for(var/mob/living/simple_animal/hostile/H in livinginview(8, user))
- mob_list += H
- if(!mob_list.len)
- return
- var/mob/living/simple_animal/hostile/target = pick(mob_list)
+ reflect_cooldown = world.time + reflect_cooldown_time
var/obj/projectile/ego_bullet/swan/S = new /obj/projectile/ego_bullet/swan(proj_turf)
S.fired_from = src //for signal check
playsound(user, 'sound/weapons/resonator_blast.ogg', 30, TRUE)
S.firer = user
- S.preparePixelProjectile(target, user)
+ S.preparePixelProjectile(attacker, user)
S.fire()
S.damage *= force_multiplier
- return
/obj/item/ego_weapon/shield/swan/Initialize()
RegisterSignal(src, COMSIG_PROJECTILE_ON_HIT, PROC_REF(projectile_hit))
@@ -1130,8 +1127,8 @@
var/obj/effect/temp_visual/small_smoke/halfsecond/smonk = new(T)
smonk.color = COLOR_GREEN
var/list/been_hit = QDELETED(M) ? list() : list(M)
- user.HurtInTurf(T, been_hit, damage, damtype, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE)
- user.HurtInTurf(T, list(), damage, aoe_damage_type, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE)
+ user.HurtInTurf(T, been_hit, damage, damtype, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
+ user.HurtInTurf(T, list(), damage, aoe_damage_type, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(prob(5))
new /obj/effect/gibspawner/generic/silent/wrath_acid(T) // The non-damaging one
var/mob/living/carbon/human/myman = user
@@ -1248,7 +1245,7 @@
var/modified_damage = mark_damage
modified_damage *= justicemod
modified_damage *= force_multiplier
- target.apply_damage(modified_damage, damage_color, null, target.run_armor_check(null, damage_color), spread_damage = TRUE) //MASSIVE fuckoff punch
+ target.deal_damage(mark_damage, damage_color, user, flags = (DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_SPECIAL)) //MASSIVE fuckoff punch
playsound(loc, 'sound/weapons/fixer/generic/energyfinisher3.ogg', 15, TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0)
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), pick(GLOB.alldirs))
@@ -1308,7 +1305,7 @@
for(var/mob/living/L in range(2, user)) //knocks enemies away from you
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(firsthit)
aoe = (aoe / 2)
firsthit = FALSE
@@ -1478,7 +1475,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(get_turf(L))
FX.color = "#a2d2df"
@@ -1776,7 +1773,7 @@
aoe*=justicemod
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_THROWING | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/tbirdlightning(get_turf(L))
icon_state = initial(icon_state)
hitsound = initial(hitsound)
@@ -1835,17 +1832,17 @@
force = 28
switch(chosen_style)
if("red")
- user.apply_damage(50, RED_DAMAGE, null, user.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ user.deal_damage(30, RED_DAMAGE, flags = (DAMAGE_FORCED))
damtype = RED_DAMAGE
to_chat(user, span_notice("Your bones are painfully sculpted to fit a muscular claw."))
hitsound = 'sound/weapons/bladeslice.ogg'
if("white")
- user.apply_damage(50, WHITE_DAMAGE, null, user.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ user.deal_damage(30, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
damtype = WHITE_DAMAGE
to_chat(user, span_notice("Your angst is plastered onto your arm."))
hitsound = 'sound/effects/hit_kick.ogg'
if("black")
- user.apply_damage(50, BLACK_DAMAGE, null, user.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ user.deal_damage(30, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
damtype = BLACK_DAMAGE
to_chat(user, span_notice("Bristles are painfully ejected from your arm, filled with hate."))
hitsound = 'sound/weapons/ego/spear1.ogg'
@@ -2061,7 +2058,7 @@
smonk.color = COLOR_TEAL
if(!ismob(thrownby))
continue
- thrownby.HurtInTurf(T, list(thrownby), damage, RED_DAMAGE)
+ thrownby.HurtInTurf(T, list(thrownby), damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_THROWING))
PowerReset(thrownby)
/datum/movespeed_modifier/anchor
@@ -2173,7 +2170,7 @@
aoe*=force_multiplier
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/abyssal_route/proc/DiveReset()
can_attack = TRUE
@@ -2306,7 +2303,7 @@
for(var/mob/living/L in T)
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
sleep(1.5)
/obj/item/ego_weapon/sunyata/proc/spin_reset()
@@ -2395,7 +2392,7 @@
. = ..()
for(var/mob/living/victim in orange(2, src))
if(faction_check(victim.faction, owner.faction))
- victim.deal_damage(5, WHITE_DAMAGE)
+ victim.deal_damage(5, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(prob(40))
playsound(owner, 'sound/abnormalities/ambling pearl/goo effect.ogg', 40)
@@ -2455,7 +2452,7 @@
if(mode)
if(M in targets)
playsound(M, 'sound/abnormalities/spiral_contempt/spiral_bleed.ogg', 100, FALSE, 4)
- M.apply_damage(ranged_damage, BLACK_DAMAGE, null, M.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ M.deal_damage(ranged_damage, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_RANGED))
new /obj/effect/temp_visual/contempt_blood(get_turf(M))
targets -= M
..()
@@ -2504,5 +2501,5 @@
var/userjust = (get_modified_attribute_level(user, JUSTICE_ATTRIBUTE))
var/justicemod = 1 + userjust/100
var/damage = force * justicemod * force_multiplier * 0.5
- target.apply_damage(damage, FIRE, null, target.run_armor_check(null, FIRE), spread_damage = TRUE)
+ target.deal_damage(damage, FIRE, src, attack_type = (ATTACK_TYPE_MELEE))
target.apply_lc_burn(3)
diff --git a/ModularTegustation/ego_weapons/ranged/ego_bullets/aleph.dm b/ModularTegustation/ego_weapons/ranged/ego_bullets/aleph.dm
index 6a246beb680b..6ce115a254f1 100644
--- a/ModularTegustation/ego_weapons/ranged/ego_bullets/aleph.dm
+++ b/ModularTegustation/ego_weapons/ranged/ego_bullets/aleph.dm
@@ -23,7 +23,7 @@
if(!isbot(H) && isliving(H) && !QDELETED(H))
H.visible_message("[target] is hit by [src], they seem to wither away!")
for(var/i = 1 to 14)
- addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living, apply_damage), rand(4,8), BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE)), 2 SECONDS * i)
+ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living, deal_damage), rand(2,4), BLACK_DAMAGE, firer, null, (ATTACK_TYPE_STATUS)), 2 SECONDS * i)
/obj/projectile/ego_bullet/adoration/aoe
color = "#6666BB"
@@ -32,7 +32,7 @@
. = ..()
for(var/mob/living/L in view(2, target))
new /obj/effect/temp_visual/revenant/cracks(get_turf(L))
- L.apply_damage(25, BLACK_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(25, BLACK_DAMAGE, firer, attack_type = (ATTACK_TYPE_RANGED))
return BULLET_ACT_HIT
/obj/projectile/ego_bullet/nihil
diff --git a/ModularTegustation/ego_weapons/ranged/ego_bullets/special.dm b/ModularTegustation/ego_weapons/ranged/ego_bullets/special.dm
index d8a3c23f202e..21891b1d7e81 100644
--- a/ModularTegustation/ego_weapons/ranged/ego_bullets/special.dm
+++ b/ModularTegustation/ego_weapons/ranged/ego_bullets/special.dm
@@ -40,7 +40,7 @@
damage = 5
/obj/projectile/ego_bullet/ego_knade
- damage = 15
+ damage = 10
speed = 1
icon_state = "kcorp_nade"
@@ -48,7 +48,7 @@
..()
for(var/turf/T in view(1, src))
for(var/mob/living/L in T)
- L.apply_damage(60, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(30, RED_DAMAGE, firer, attack_type = (ATTACK_TYPE_RANGED))
new /obj/effect/explosion(get_turf(src))
qdel(src)
return BULLET_ACT_HIT
diff --git a/ModularTegustation/ego_weapons/ranged/ego_bullets/teth.dm b/ModularTegustation/ego_weapons/ranged/ego_bullets/teth.dm
index 278b9fc79848..b514cc0f6493 100644
--- a/ModularTegustation/ego_weapons/ranged/ego_bullets/teth.dm
+++ b/ModularTegustation/ego_weapons/ranged/ego_bullets/teth.dm
@@ -9,7 +9,7 @@
..()
for(var/mob/living/L in view(1, target))
new /obj/effect/temp_visual/fire/fast(get_turf(L))
- L.apply_damage(aoe_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe_damage, RED_DAMAGE, firer, attack_type = (ATTACK_TYPE_RANGED))
return BULLET_ACT_HIT
/obj/projectile/ego_bullet/ego_beak
diff --git a/ModularTegustation/ego_weapons/ranged/special.dm b/ModularTegustation/ego_weapons/ranged/special.dm
index 5d0033f1d910..0e90c28db361 100644
--- a/ModularTegustation/ego_weapons/ranged/special.dm
+++ b/ModularTegustation/ego_weapons/ranged/special.dm
@@ -59,7 +59,7 @@
if(do_after(H, 12, src))
to_chat(H,"You cover yourself in flames!")
H.playsound_local(get_turf(H), 'sound/effects/burn.ogg', 100, 0)
- H.apply_damage(10, RED_DAMAGE, null, H.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(5, RED_DAMAGE, flags = (DAMAGE_FORCED))
H.adjust_fire_stacks(1)
H.IgniteMob()
@@ -133,7 +133,7 @@
for(var/mob/living/L in range(2, stepturf)) //knocks enemies away from you
if(L == user || ishuman(L))
continue
- L.apply_damage(aoe, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(aoe, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
if(firsthit)
aoe = (aoe / 2)
firsthit = FALSE
diff --git a/ModularTegustation/ego_weapons/ranged/waw.dm b/ModularTegustation/ego_weapons/ranged/waw.dm
index 8107bc8c603d..35347cb71c55 100644
--- a/ModularTegustation/ego_weapons/ranged/waw.dm
+++ b/ModularTegustation/ego_weapons/ranged/waw.dm
@@ -686,7 +686,7 @@
var/mob/living/L = AM
if(!faction_check(faction, L.faction))
playsound(get_turf(src), 'sound/machines/clockcult/steam_whoosh.ogg', 10, 1)
- L.apply_damage(20, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = FALSE)
+ L.deal_damage(20, RED_DAMAGE, creator, flags = (DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_ENVIRONMENT))
new /obj/effect/temp_visual/cloud_swirl(get_turf(L)) //placeholder
to_chat(creator, span_warning("You feel a itch towards [get_area(L)]."))
qdel(src)
diff --git a/ModularTegustation/living/damage_procs.dm b/ModularTegustation/living/damage_procs.dm
index 0fd6f57a7435..3584e632d535 100644
--- a/ModularTegustation/living/damage_procs.dm
+++ b/ModularTegustation/living/damage_procs.dm
@@ -1,19 +1,97 @@
-/**
- * The deal damage proc is a replacement for apply_damage() aimed to reduce copy-paste.
- * In comparison to apply_damage() it:
- * * Automatically checks for armor, and applies its damage reduction effects
- * * Can deal with multiple damages, read damage_type point 1
- *
- * damage_amount = The amount of damage you want to apply.
- *
- * damage_type = The damage types you want to apply, can be a list.
- * * if damage_type is a list, it will divide the damage_amount by the list lenght to always be at the "same" damage then it will apply each damage in the list equally, considering their individual armor values.
- */
-/mob/living/proc/deal_damage(damage_amount, damage_type)
- if(!islist(damage_type)) // they just want to apply a single damage type
- return apply_damage(damage_amount, damage_type, blocked = (damage_type != BRUTE ? run_armor_check(null, damage_type) : null), spread_damage = TRUE)
+/*
+This proc deals damage to this mob.
+damage_amount - How much damage we're taking.
+damage_type - What kind of damage this is. For example, RED damage, WHITE damage, Stamina damage or Toxin damage. If it is one of the 4 LC13 colours, it may be shuffled if the trait is active.
+source - The person or mob or thing in general that caused us to take damage. This needs to be included if you want the damage to count towards aggro for hostile mobs, and if some action should be able to be taken by the receiving mob afterwards (like a counterattack).
+flags - Special flags to customize damage behaviour, for example by making the damage untrackable. It is a bitfield. You may find the defines for it in code\__DEFINES\damage.dm
+attack_type - What kind of attack is this damage coming from? It is a bitfield. You may find the defines for it in code\__DEFINES\damage.dm
+blocked - The armour which will reduce incoming damage. Leave this as null to automatically check for armour corresponding to the incoming damage type. If you want to run your own custom armour check, send it as this argument.
+def_zone - The zone that's being hit. You can safely leave this as null.
+wound_bonus - Irrelevant to anyone but carbons.
+bare_wound_bonus - Irrelevant to anyone but carbons.
+sharpness - Irrelevant in most cases.
+*/
+
+
+
+
+/mob/living/proc/deal_damage(damage_amount, damage_type = BRUTE, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
+ if(!damage_amount) // There are some extremely rare instances of 0 damage pre-armour reduction, for example King of Greed does a 0 damage HurtInTurf to fill up a hitlist to attack later.
+ return FALSE
+ var/alive = stat < DEAD
+
+ // Damage shuffler station trait.
+ if(GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damage_type))
+ var/datum/damage_type_shuffler/shuffler = GLOB.damage_type_shuffler
+ var/new_damage_type = shuffler.mapping_offense[damage_type]
+ damage_type = new_damage_type
+
+ if(alive && (!(flags & DAMAGE_FORCED)) && (!PreDamageReaction(damage_amount, damage_type, source, attack_type))) // If our forced argument isn't TRUE, then we expect to receive a TRUE from PreDamageReaction to continue the proc.
+ return FALSE
+
+ // We will now send a signal that gives listeners the opportunity to cancel the damage being dealt. For some reason, in the original apply_damage, this happens before a "final damage" calculation, so I have chosen to preserve that behaviour.
+ // Some examples of the listeners that may return COMPONENT_MOB_DENY_DAMAGE are manager shields, the Welfare Core reward, or Sweeper Persistence.
+ var/signal_return = SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage_amount, damage_type, def_zone)
+ if(signal_return & COMPONENT_MOB_DENY_DAMAGE)
+ return FALSE
+
+ // Automatically run an armour check for the provided damage type if we weren't already provided with a blocked value, and if we aren't taking BRUTE damage.
+ if((isnull(blocked)) && (damage_type != BRUTE))
+ blocked = run_armor_check(null, damage_type)
+
+ var/hit_percent = (100-blocked)/100
+ var/bypass_resistance = flags & DAMAGE_PIERCING
+
+ if(hit_percent <= 0 && !(bypass_resistance))
+ return FALSE
+
+ var/final_damage = bypass_resistance ? damage_amount : damage_amount * hit_percent
+
+ // Mind - apparently regular mobs don't have actual armor, their damage coeffs are the ones that handle reducing/increasing damage within the adjustXLoss procs.
+ switch(damage_type)
+ if(FIRE)
+ adjustFireLoss(final_damage, forced = bypass_resistance)
+ if(TOX)
+ adjustToxLoss(final_damage, forced = bypass_resistance)
+ if(OXY)
+ adjustOxyLoss(final_damage, forced = bypass_resistance)
+ if(CLONE)
+ adjustCloneLoss(final_damage, forced = bypass_resistance)
+ if(STAMINA)
+ adjustStaminaLoss(final_damage, forced = bypass_resistance)
+ if(RED_DAMAGE)
+ adjustRedLoss(final_damage, forced = bypass_resistance)
+ if(WHITE_DAMAGE)
+ adjustWhiteLoss(final_damage, forced = bypass_resistance, white_healable = flags & DAMAGE_WHITE_HEALABLE)
+ if(BLACK_DAMAGE)
+ adjustBlackLoss(final_damage, forced = bypass_resistance, white_healable = flags & DAMAGE_WHITE_HEALABLE)
+ if(PALE_DAMAGE)
+ adjustPaleLoss(final_damage, forced = bypass_resistance)
+ if(AGGRO_DAMAGE)
+ var/mob/living/simple_animal/hostile/taunted = src
+ if(source && istype(taunted))
+ taunted.RegisterAggroValue(source, final_damage, AGGRO_DAMAGE)
+ else
+ adjustBruteLoss(final_damage, forced = bypass_resistance)
+
+ if(alive && !(status_flags & GODMODE))
+ PostDamageReaction(final_damage, damage_type, flags & DAMAGE_UNTRACKABLE ? null : source, attack_type, source, flags, attack_type)
+
+ return final_damage
+
+/// This proc uses the same arguments as deal_damage but expects damage_type to be a list of damage types, and it will deal (damage_amount / length(damage_type)) of each damage_type in the list to the target.
+// Important: If you pass this proc a "blocked" argument, it will use that same value for all the damages dealt. If you don't, it'll run the corresponding armour check for each damage type sent.
+// That is to say, if you're dealing RED, WHITE and BLACK damage, and send "blocked = run_armor_check(null, PALE_DAMAGE)", all the damage you deal will be judged by PALE armour.
+/mob/living/proc/deal_split_damage(damage_amount, damage_type = BRUTE, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
+ if(!islist(damage_type)) // You're using deal_split_damage to deal a single type of damage. This is the same as just calling deal_damage. Abnormalities do this in WorktickFailure to accomodate for multi-work damage abnos (LooS, DF)
+ deal_damage(damage_amount, damage_type, source, flags, attack_type, blocked, def_zone, wound_bonus, bare_wound_bonus, sharpness)
+ return
var/list/damage_types = damage_type
- damage_amount = damage_amount / damage_types.len // make sure the damage amount is still correct by dividing it
- for(var/damage as anything in damage_types)
- apply_damage(damage_amount, damage, blocked = (damage_type != BRUTE ? run_armor_check(null, damage) : null), spread_damage = TRUE)
+ var/amount_of_types = length(damage_types)
+ if(amount_of_types <= 0) // Gulp
+ return
+
+ damage_amount /= amount_of_types
+ for(var/split_type as anything in damage_types)
+ deal_damage(damage_amount, split_type, source, flags, attack_type, blocked, def_zone, wound_bonus, bare_wound_bonus, sharpness)
diff --git a/ModularTegustation/t5_parts.dm b/ModularTegustation/t5_parts.dm
index 25d89d697287..6b955cfbe5ad 100644
--- a/ModularTegustation/t5_parts.dm
+++ b/ModularTegustation/t5_parts.dm
@@ -192,12 +192,12 @@
playsound(loc, 'sound/effects/splat.ogg', 50, TRUE)
var/damage = rand(7,9) //Choose a number between 7 and 9, then use that number for the damage calculations applied to the head, chest, legs and arms.
- H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_HEAD, H.run_armor_check(BODY_ZONE_HEAD, "melee"))
- H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_CHEST, H.run_armor_check(BODY_ZONE_CHEST, "melee"))
- H.apply_damage(0.25*damage, BRUTE, BODY_ZONE_L_LEG, H.run_armor_check(BODY_ZONE_L_LEG, "melee"))
- H.apply_damage(0.25*damage, BRUTE, BODY_ZONE_R_LEG, H.run_armor_check(BODY_ZONE_R_LEG, "melee"))
- H.apply_damage(0.25*damage, BRUTE, BODY_ZONE_L_ARM, H.run_armor_check(BODY_ZONE_L_ARM, "melee"))
- H.apply_damage(0.25*damage, BRUTE, BODY_ZONE_R_ARM, H.run_armor_check(BODY_ZONE_R_ARM, "melee")) //in total, this will be 42-54 damage (before the application of melee armor)
+ H.deal_damage(0.5*damage, BRUTE, def_zone = BODY_ZONE_HEAD, blocked = H.run_armor_check(BODY_ZONE_HEAD, "melee"))
+ H.deal_damage(0.5*damage, BRUTE, def_zone = BODY_ZONE_CHEST, blocked = H.run_armor_check(BODY_ZONE_CHEST, "melee"))
+ H.deal_damage(0.25*damage, BRUTE, def_zone = BODY_ZONE_L_LEG, blocked = H.run_armor_check(BODY_ZONE_L_LEG, "melee"))
+ H.deal_damage(0.25*damage, BRUTE, def_zone = BODY_ZONE_R_LEG, blocked = H.run_armor_check(BODY_ZONE_R_LEG, "melee"))
+ H.deal_damage(0.25*damage, BRUTE, def_zone = BODY_ZONE_L_ARM, blocked = H.run_armor_check(BODY_ZONE_L_ARM, "melee"))
+ H.deal_damage(0.25*damage, BRUTE, def_zone = BODY_ZONE_R_ARM, blocked = H.run_armor_check(BODY_ZONE_R_ARM, "melee")) //in total, this will be 42-54 damage (before the application of melee armor)
H.Knockdown(40)
var/turf/T = get_turf(src)
diff --git a/ModularTegustation/tegu_drinks/twistedtea.dm b/ModularTegustation/tegu_drinks/twistedtea.dm
index 60c684bfa8b0..cd6933240de1 100644
--- a/ModularTegustation/tegu_drinks/twistedtea.dm
+++ b/ModularTegustation/tegu_drinks/twistedtea.dm
@@ -78,7 +78,7 @@
var/obj/item/bodypart/affecting = target.get_bodypart(BODY_ZONE_CHEST)
var/armor_block = target.run_armor_check(affecting, MELEE)
- target.apply_damage(rand(40,50), STAMINA, affecting, armor_block)
+ target.deal_damage(rand(40,50), STAMINA, source = user, def_zone = affecting, blocked = armor_block)
target.Knockdown(90)
playsound(src, hitsound, 60, TRUE)
diff --git a/ModularTegustation/tegu_items/associations/skills/liu/associate.dm b/ModularTegustation/tegu_items/associations/skills/liu/associate.dm
index b998a4e81324..2edc7f8c6fcf 100644
--- a/ModularTegustation/tegu_items/associations/skills/liu/associate.dm
+++ b/ModularTegustation/tegu_items/associations/skills/liu/associate.dm
@@ -81,7 +81,7 @@
var/damage = 4
if(!ishuman(fuel))
damage = 8
- fuel.apply_damage(damage, FIRE, null, fuel.run_armor_check(null, FIRE), spread_damage = TRUE)
+ fuel.deal_damage(damage, FIRE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
fuel.adjust_fire_stacks(1)
fuel.IgniteMob()
diff --git a/ModularTegustation/tegu_items/enkephalin_rush/enkr_mobs.dm b/ModularTegustation/tegu_items/enkephalin_rush/enkr_mobs.dm
index c361e1f759ce..225e9d41556a 100644
--- a/ModularTegustation/tegu_items/enkephalin_rush/enkr_mobs.dm
+++ b/ModularTegustation/tegu_items/enkephalin_rush/enkr_mobs.dm
@@ -427,7 +427,7 @@
SLEEP_CHECK_DEATH(3)
TH.attack_animal(src)
for(var/mob/living/carbon/human/H in view(7, get_turf(src)))
- H.deal_damage(15, WHITE_DAMAGE)
+ H.deal_damage(15, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if(!targets_from.Adjacent(TH) || QDELETED(TH))
can_act = TRUE
return
@@ -443,7 +443,7 @@
do_attack_animation(target_turf)
for(var/turf/T in range(hammer_aoe, target_turf))
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, melee_damage_upper, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15)
+ been_hit = HurtInTurf(T, been_hit, melee_damage_upper, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/humanoid/ncorp/OpenFire()
..()
@@ -468,7 +468,7 @@
break
broken = TRUE
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, ranged_damage, BLACK_DAMAGE, null, TRUE)
+ been_hit = HurtInTurf(T, been_hit, ranged_damage, BLACK_DAMAGE, null, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
//TODO: apply nails here
playsound(get_turf(src), 'sound/weapons/fixer/generic/nail2.ogg', 100, 1)
diff --git a/ModularTegustation/tegu_items/enkephalin_rush/ore_turfs.dm b/ModularTegustation/tegu_items/enkephalin_rush/ore_turfs.dm
index eeac972c2307..00dfab6f1255 100644
--- a/ModularTegustation/tegu_items/enkephalin_rush/ore_turfs.dm
+++ b/ModularTegustation/tegu_items/enkephalin_rush/ore_turfs.dm
@@ -180,7 +180,7 @@
visible_message(span_danger("The ground starts shaking!"))
playsound(get_turf(src), 'sound/effects/lc13_environment/day_50/Shake_Move.ogg', 60, TRUE)
for(var/mob/living/L in view(12, src))
- L.apply_damage(explosion_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(explosion_damage, WHITE_DAMAGE, null, attack_type = (ATTACK_TYPE_ENVIRONMENT))
shake_camera(L, 20, 3)
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -193,7 +193,7 @@
new /obj/effect/temp_visual/explosion(get_turf(src))
playsound(get_turf(src), 'sound/effects/ordeals/steel/gcorp_boom.ogg', 60, TRUE)
for(var/mob/living/L in view(3, src))
- L.apply_damage(explosion_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(explosion_damage, BLACK_DAMAGE, null, attack_type = (ATTACK_TYPE_ENVIRONMENT))
return
else//Qliphoth Meltdown
if(risk_level >= 3)
@@ -336,7 +336,7 @@
/obj/effect/rock_fall/proc/explode()
playsound(get_turf(src), 'sound/effects/lc13_environment/day_50/Shake_End.ogg', 50, 0, 8)
for(var/mob/living/L in view(1, src))
- L.apply_damage(boom_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(boom_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
shake_camera(L, 5, 3)
var/datum/effect_system/smoke_spread/S = new
S.set_up(0, get_turf(src)) //Smoke shouldn't really obstruct your vision
diff --git a/ModularTegustation/tegu_items/rcorp/objective.dm b/ModularTegustation/tegu_items/rcorp/objective.dm
index f015037688dd..6ca57ddc188d 100644
--- a/ModularTegustation/tegu_items/rcorp/objective.dm
+++ b/ModularTegustation/tegu_items/rcorp/objective.dm
@@ -279,7 +279,7 @@ GLOBAL_VAR_INIT(rcorp_payload, null)
/mob/living/simple_animal/hostile/shrimp_vip/proc/SniperShoot()
to_chat(src, span_userdanger("You are hit by a sniper bullet from an unknown sniper..."))
- deal_damage(300, RED_DAMAGE)
+ deal_damage(300, RED_DAMAGE, flags = (DAMAGE_FORCED))
playsound_local(src, 'sound/weapons/gun/sniper/shot.ogg', 75)
sniper = null
@@ -339,7 +339,7 @@ GLOBAL_VAR_INIT(rcorp_payload, null)
sleep(34)
for(var/turf/AT in range(2, landingzone))
new /obj/effect/temp_visual/smash_effect(AT)
- dummy.HurtInTurf(AT, list(), (200), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ dummy.HurtInTurf(AT, list(), (200), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_SPECIAL))
playsound(dummy, 'sound/effects/explosion2.ogg', 50, TRUE)
qdel(dummy)
sleep(rand()*2)
diff --git a/ModularTegustation/tegu_items/workshop/mods/aoe.dm b/ModularTegustation/tegu_items/workshop/mods/aoe.dm
index 90f765272f00..c0d18533cd9d 100644
--- a/ModularTegustation/tegu_items/workshop/mods/aoe.dm
+++ b/ModularTegustation/tegu_items/workshop/mods/aoe.dm
@@ -23,7 +23,7 @@
aoe_damage*=justicemod
if(L == user)
return
- L.deal_damage(aoe_damage, damagetype)
+ L.deal_damage(aoe_damage, damagetype, user, attack_type = (ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(L))
/obj/item/workshop_mod/aoe/red
diff --git a/ModularTegustation/tegu_items/workshop/mods/split.dm b/ModularTegustation/tegu_items/workshop/mods/split.dm
index b9e7a6812248..0391ed65fbcf 100644
--- a/ModularTegustation/tegu_items/workshop/mods/split.dm
+++ b/ModularTegustation/tegu_items/workshop/mods/split.dm
@@ -14,7 +14,7 @@
splitdamagetype = PALE_DAMAGE
if(WHITE_DAMAGE)
splitdamagetype = BLACK_DAMAGE
- target.deal_damage(splitdamage, splitdamagetype)
+ target.deal_damage(splitdamage, splitdamagetype, user, attack_type = (ATTACK_TYPE_MELEE))
/obj/item/workshop_mod/split/redpale
name = "split damage mod A"
diff --git a/ModularTegustation/tegu_items/workshop/templates/chargeblade.dm b/ModularTegustation/tegu_items/workshop/templates/chargeblade.dm
index 86cd4a565896..95822f4a48fe 100644
--- a/ModularTegustation/tegu_items/workshop/templates/chargeblade.dm
+++ b/ModularTegustation/tegu_items/workshop/templates/chargeblade.dm
@@ -19,4 +19,4 @@
/obj/item/ego_weapon/template/chargeblade/ChargeAttack(mob/living/target, mob/living/user)
. = ..()
- target.deal_damage(force, damtype)
+ target.deal_damage(force, damtype, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
diff --git a/ModularTegustation/tegu_items/workshop/templates/gauntlet.dm b/ModularTegustation/tegu_items/workshop/templates/gauntlet.dm
index f9de36cbf178..ae23b0317e80 100644
--- a/ModularTegustation/tegu_items/workshop/templates/gauntlet.dm
+++ b/ModularTegustation/tegu_items/workshop/templates/gauntlet.dm
@@ -35,7 +35,7 @@
if(target.stat != DEAD)
weapon_xp++
- target.deal_damage(force, damtype) //MASSIVE fuckoff punch
+ target.deal_damage(force, damtype, user, attack_type = (ATTACK_TYPE_MELEE)) //MASSIVE fuckoff punch
playsound(src, 'sound/weapons/resonator_blast.ogg', 50, TRUE)
var/atom/throw_target = get_edge_target_turf(target, user.dir)
diff --git a/ModularTegustation/tegu_mobs/apocalypse_bird.dm b/ModularTegustation/tegu_mobs/apocalypse_bird.dm
index a905c2ebaec4..4b6259dbfe9e 100644
--- a/ModularTegustation/tegu_mobs/apocalypse_bird.dm
+++ b/ModularTegustation/tegu_mobs/apocalypse_bird.dm
@@ -190,7 +190,7 @@
for(var/mob/living/L in livinginview(8, src))
if(faction_check_mob(L))
continue
- L.apply_damage(slam_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(slam_damage, BLACK_DAMAGE, null, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(2 SECONDS)
attacking = FALSE
slam_cooldown = world.time + slam_cooldown_time
@@ -278,7 +278,7 @@
var/list/been_hit = list()
for(var/turf/TF in area_of_effect)
new /obj/effect/temp_visual/beakbite(TF)
- var/list/new_hits = HurtInTurf(TF, been_hit, bite_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(TF, been_hit, bite_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
if(L.health < 0)
@@ -307,7 +307,7 @@
if(L.stat == DEAD)
continue
new /obj/effect/temp_visual/judgement(get_turf(L))
- L.apply_damage(judge_damage, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(judge_damage, PALE_DAMAGE, null, src, attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(1 SECONDS)
icon_state = icon_living
SLEEP_CHECK_DEATH(1 SECONDS)
diff --git a/ModularTegustation/tegu_mobs/chaos_marine.dm b/ModularTegustation/tegu_mobs/chaos_marine.dm
index 0d35f01bafc4..71b39f5d0b40 100644
--- a/ModularTegustation/tegu_mobs/chaos_marine.dm
+++ b/ModularTegustation/tegu_mobs/chaos_marine.dm
@@ -267,7 +267,7 @@
visible_message(span_boldwarning("[src] runs through [L]!"))
to_chat(L, span_userdanger("[src] pierces you with a chain-sword!"))
shake_camera(L, 2, 1)
- L.apply_damage(75, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(75, RED_DAMAGE, null, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(L,"sound/effects/wounds/pierce[pick(1,2,3)].ogg", 200, 1)
addtimer(CALLBACK(src, PROC_REF(blood_dash_2), move_dir, (times_ran + 1)), (1.5 * dash_mod))
diff --git a/ModularTegustation/tegu_mobs/lc13_blood_fiend.dm b/ModularTegustation/tegu_mobs/lc13_blood_fiend.dm
index 159ab061d6e9..dd512e3db810 100644
--- a/ModularTegustation/tegu_mobs/lc13_blood_fiend.dm
+++ b/ModularTegustation/tegu_mobs/lc13_blood_fiend.dm
@@ -89,7 +89,7 @@
continue
var/obj/effect/temp_visual/slice/blood = new(T)
blood.color = "#b52e19"
- hit_mob = HurtInTurf(T, hit_mob, slash_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE)
+ hit_mob = HurtInTurf(T, hit_mob, slash_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/obj/effect/temp_visual/warning3x3/bloodfiend
duration = 1.5 SECONDS
@@ -120,7 +120,7 @@
if(faction_check_mob(L))
continue
L.apply_lc_bleed(leap_bleed_stacks)
- L.deal_damage(leap_damage, RED_DAMAGE)
+ L.deal_damage(leap_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
for(var/obj/vehicle/sealed/mecha/V in T)
V.take_damage(leap_damage, RED_DAMAGE)
SLEEP_CHECK_DEATH(0.5 SECONDS)
@@ -349,7 +349,7 @@
continue;
var/obj/effect/temp_visual/slice/blood = new(T)
blood.color = "#b52e19"
- hit_list = HurtInTurf(T, hit_list, slash_damage, RED_DAMAGE, null, TRUE, TRUE, TRUE, hurt_structure = TRUE)
+ hit_list = HurtInTurf(T, hit_list, slash_damage, RED_DAMAGE, null, TRUE, TRUE, TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
for (var/hit in hit_list)
if (istype(hit, /mob/living))
var/mob/living/L = hit
@@ -469,7 +469,7 @@
/mob/living/simple_animal/hostile/humanoid/blood/bag/proc/DeathExplosion()
playsound(loc, 'sound/effects/ordeals/crimson/dusk_dead.ogg', 60, TRUE)
for(var/mob/living/L in view(1, src))
- L.deal_damage(explosion_damage, RED_DAMAGE)
+ L.deal_damage(explosion_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
L.apply_lc_bleed(explosion_bleed)
var/turf/origin = get_turf(src)
var/list/all_turfs = RANGE_TURFS(1, origin)
diff --git a/ModularTegustation/tegu_mobs/lc13_corrosions.dm b/ModularTegustation/tegu_mobs/lc13_corrosions.dm
index 803fff75c6bf..de0142f181d3 100644
--- a/ModularTegustation/tegu_mobs/lc13_corrosions.dm
+++ b/ModularTegustation/tegu_mobs/lc13_corrosions.dm
@@ -45,7 +45,7 @@
playsound(src, 'sound/weapons/ego/sword1.ogg', min(15 + damage, 100), TRUE, 4)
attacker.visible_message(span_danger("[src] counters [attacker] with a massive blade!"), span_userdanger("[src] counters your attack!"))
do_attack_animation(attacker)
- attacker.apply_damage(damage, attack_type, null, attacker.getarmor(null, attack_type))
+ attacker.deal_damage(damage, attack_type, src, attack_type = (ATTACK_TYPE_COUNTER | ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/revenant(get_turf(attacker))
/mob/living/simple_animal/hostile/ordeal/NT_corrosion/death(gibbed)
@@ -58,43 +58,19 @@
return FALSE
return ..()
-/mob/living/simple_animal/hostile/ordeal/NT_corrosion/attack_hand(mob/living/carbon/human/M)
- ..()
- if(!.)
- return
- if(damage_reflection && M.a_intent == INTENT_HARM)
- ReflectDamage(M, M?.dna?.species?.attack_type, M?.dna?.species?.punchdamagehigh)
-
-/mob/living/simple_animal/hostile/ordeal/NT_corrosion/attack_paw(mob/living/carbon/human/M)
- ..()
- if(damage_reflection && M.a_intent != INTENT_HELP)
- ReflectDamage(M, M?.dna?.species?.attack_type, 5)
-
-/mob/living/simple_animal/hostile/ordeal/NT_corrosion/attack_animal(mob/living/simple_animal/M)
+/mob/living/simple_animal/hostile/ordeal/NT_corrosion/PreDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- if(!damage_reflection)
+ if(!damage_reflection || !isliving(source)) // Only execute the rest of the code if we're reflecting damage and we were provided with a source for it
return
- if(.)
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- if(damage > 0)
- ReflectDamage(M, M.melee_damage_type, damage)
-
-/mob/living/simple_animal/hostile/ordeal/NT_corrosion/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE)
- ..()
- if(damage_reflection && Proj.firer)
- if(get_dist(Proj.firer, src) < 5)
- ReflectDamage(Proj.firer, Proj.damage_type, Proj.damage)
+ if((attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS))) // Don't counter these types of attacks, but prevent the damage on them anyway.
+ return FALSE
+ if((attack_type & (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL)) && get_dist(src, source) >= 5) // Counter these types of attacks only if within 5 tiles (as it used to work)
+ return FALSE
-/mob/living/simple_animal/hostile/ordeal/NT_corrosion/attackby(obj/item/I, mob/living/user, params)
- ..()
- if(!damage_reflection)
- return
- var/damage = I.force
- if(ishuman(user))
- damage *= 1 + (get_attribute_level(user, JUSTICE_ATTRIBUTE)/100)
- ReflectDamage(user, I.damtype, damage)
+ ReflectDamage(source, damage_type, damage_amount)
+ return FALSE // Damage is prevented on us yippee
-/mob/living/simple_animal/hostile/ordeal/NT_corrosion/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+/mob/living/simple_animal/hostile/ordeal/NT_corrosion/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(. > 0)
damage_taken += .
@@ -104,7 +80,7 @@
if(!can_act)
return
if(damage_taken > 400 && !damage_reflection)
- StartReflecting()
+ INVOKE_ASYNC(src, PROC_REF(StartReflecting))
/mob/living/simple_animal/hostile/ordeal/NT_corrosion/proc/StartReflecting()
can_act = FALSE
@@ -113,12 +89,10 @@
playsound(get_turf(src), 'sound/abnormalities/nothingthere/breach.ogg', 25, 0, 5)
visible_message(span_warning("[src] assumes a stance!"))
icon_state = "everything_there_guard"
- ChangeResistances(list(RED_DAMAGE = 0, WHITE_DAMAGE = 0, BLACK_DAMAGE = 0, PALE_DAMAGE = 0))
sleep(2 SECONDS)
if(QDELETED(src) || stat == DEAD)
return
icon_state = icon_living
- ChangeResistances(list(RED_DAMAGE = 0, WHITE_DAMAGE = 0.8, BLACK_DAMAGE = 0.8, PALE_DAMAGE = 1.3))
damage_reflection = FALSE
can_act = TRUE
@@ -148,7 +122,7 @@
if(TF.density)
continue
new /obj/effect/temp_visual/smash_effect(TF)
- been_hit = HurtInTurf(TF, been_hit, hello_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE)
+ been_hit = HurtInTurf(TF, been_hit, hello_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in been_hit)
if(L.health < 0)
L.gib()
@@ -229,10 +203,10 @@
for(var/mob/living/H in T)
if(faction_check_mob(H))
continue
- H.apply_damage(poison_damage, BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(poison_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_SPECIAL))
H.apply_venom(2)
-/mob/living/simple_animal/hostile/ordeal/snake_corrosion/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/ordeal/snake_corrosion/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(poison_releasing)
return
@@ -489,7 +463,7 @@
to_chat(L, span_userdanger("[src] takes a bite out of you!"))
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/kinetic_blast(LT)
- L.apply_damage(dash_damage,RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(dash_damage,RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
been_hit += L
playsound(L, 'sound/effects/ordeals/brown/cromer_stab.ogg', 75, 1)
if(!ishuman(L))
diff --git a/ModularTegustation/tegu_mobs/lc13_cuckoospawn.dm b/ModularTegustation/tegu_mobs/lc13_cuckoospawn.dm
index c369c23c124b..7eccc23f0b9f 100644
--- a/ModularTegustation/tegu_mobs/lc13_cuckoospawn.dm
+++ b/ModularTegustation/tegu_mobs/lc13_cuckoospawn.dm
@@ -66,7 +66,7 @@
. = ..()
if(isanimal(attacked_target))
var/mob/living/simple_animal/easy_target = attacked_target
- easy_target.deal_damage(melee_damage_upper * 3, RED_DAMAGE)
+ easy_target.deal_damage(melee_damage_upper * 3, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE))
if(human_target.stat != DEAD && prob(5))
var/obj/item/bodypart/chest/LC = human_target.get_bodypart(BODY_ZONE_CHEST)
if((!LC || LC.status != BODYPART_ROBOTIC) && !human_target.getorgan(/obj/item/organ/body_egg/cuckoospawn_embryo) && !HAS_TRAIT(human_target, TRAIT_XENO_IMMUNE))
diff --git a/ModularTegustation/tegu_mobs/lc13_humanoids.dm b/ModularTegustation/tegu_mobs/lc13_humanoids.dm
index 08aef27560ad..7de82556df68 100644
--- a/ModularTegustation/tegu_mobs/lc13_humanoids.dm
+++ b/ModularTegustation/tegu_mobs/lc13_humanoids.dm
@@ -113,7 +113,7 @@ GLOBAL_LIST_EMPTY(nuke_rats_players)
SLEEP_CHECK_DEATH(1 SECONDS)
forceMove(slash_end)
for(var/turf/T in hitline)
- for(var/mob/living/L in HurtInTurf(T, list(), dash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), dash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
to_chat(L, span_userdanger("[src] quickly slashes you!"))
new /datum/beam(slash_start.Beam(slash_end, "1-full", time=3))
playsound(src, attack_sound, 50, FALSE, 4)
@@ -392,7 +392,7 @@ GLOBAL_LIST_EMPTY(nuke_rats_players)
var/mob/living/simple_animal/hostile/metal_fixer_statue/S = L
qdel(S)
hit_statue = TRUE
- HurtInTurf(T, list(), aoe_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE)
+ HurtInTurf(T, list(), aoe_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(hit_statue)
say("...")
@@ -644,7 +644,7 @@ GLOBAL_LIST_EMPTY(nuke_rats_players)
new /obj/effect/temp_visual/mech_fire(T)
for(var/mob/living/L in T)
if(!faction_check_mob(L, FALSE) && !(locate(L) in hit_mob))
- L.apply_damage(dash_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(dash_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
LAZYADD(hit_mob, L)
@@ -725,8 +725,8 @@ GLOBAL_LIST_EMPTY(nuke_rats_players)
playsound(src, 'sound/weapons/ego/burn_guard.ogg', min(15 + damage, 75), TRUE, 4)
attacker.visible_message(span_danger("[src] hits [attacker] with a counterattack!"), span_userdanger("[src] counters your attack!"))
do_attack_animation(attacker)
- attacker.apply_damage(damage * 2, attack_type, null, attacker.getarmor(null, attack_type))
- attacker.apply_damage(damage, STAMINA, null, null)
+ attacker.deal_damage(damage * 2, attack_type, source = src, attack_type = (ATTACK_TYPE_COUNTER))
+ attacker.deal_damage(damage, STAMINA, source = src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_COUNTER))
diff --git a/ModularTegustation/tegu_mobs/lc13_nuke_clowns.dm b/ModularTegustation/tegu_mobs/lc13_nuke_clowns.dm
index 8f654ef39334..3d6d3f859300 100644
--- a/ModularTegustation/tegu_mobs/lc13_nuke_clowns.dm
+++ b/ModularTegustation/tegu_mobs/lc13_nuke_clowns.dm
@@ -79,7 +79,7 @@
SLEEP_CHECK_DEATH(6)
for(var/mob/living/L in view(7, src))
if(!faction_check_mob(L))
- L.apply_damage(scream_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(scream_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
can_act = TRUE
/mob/living/simple_animal/hostile/mutant_clown/proc/Slam()
@@ -87,7 +87,7 @@
face_atom(target)
for(var/turf/T in view(1, src))
new /obj/effect/temp_visual/smash1(T)
- HurtInTurf(T, list(), (rand(melee_damage_lower, melee_damage_upper)), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), (rand(melee_damage_lower, melee_damage_upper)), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/abnormalities/mountain/slam.ogg', 50, 0, 3)
SLEEP_CHECK_DEATH(0.4 SECONDS)
can_act = TRUE
@@ -266,7 +266,7 @@
for(var/turf/T in view(1, src))
new /obj/effect/temp_visual/smash_effect(T)
new /obj/effect/decal/cleanable/blood(T)
- caster.HurtInTurf(T, list(), damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = FALSE)
+ caster.HurtInTurf(T, list(), damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = FALSE, attack_type = (ATTACK_TYPE_SPECIAL))
qdel(src)
/obj/item/mutant_heart
@@ -303,4 +303,4 @@
min_next_adrenaline = world.time + rand(10, 20)
to_chat(joyful, "This pain... Brings us such joy...")
joyful.heal_overall_damage(regen_amount*regen_mult, regen_amount*regen_mult, regen_amount*regen_mult, BODYPART_ORGANIC)
- joyful.apply_damage(regen_amount, WHITE_DAMAGE)
+ joyful.deal_damage(regen_amount, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
diff --git a/ModularTegustation/tegu_mobs/lc13_outskirtdwellers.dm b/ModularTegustation/tegu_mobs/lc13_outskirtdwellers.dm
index 5ece2dce389a..c63f6cb7a0c7 100644
--- a/ModularTegustation/tegu_mobs/lc13_outskirtdwellers.dm
+++ b/ModularTegustation/tegu_mobs/lc13_outskirtdwellers.dm
@@ -362,7 +362,7 @@
visible_message(span_danger("[src] suddenly explodes!"))
for(var/mob/living/L in view(5, src))
if(!faction_check_mob(L))
- L.apply_damage(35, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(35, RED_DAMAGE, src, flags = (ATTACK_TYPE_SPECIAL))
gib()
// bigBirdEye
@@ -579,7 +579,7 @@ Mobs that mostly focus on dealing RED damage, they are all a bit more frail than
SLEEP_CHECK_DEATH(6)
for(var/mob/living/L in view(3, src))
if(!faction_check_mob(L))
- L.apply_damage(5, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(5, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED))
can_act = TRUE
//Love Town Slasher - TETH goons, not much of a threat
@@ -678,7 +678,7 @@ Mobs that mostly focus on dealing RED damage, they are all a bit more frail than
SLEEP_CHECK_DEATH(6)
for(var/mob/living/L in view(4, src))
if(!faction_check_mob(L))
- L.apply_damage(33, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(33, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
can_act = TRUE
// Love Town Slumberer - HE threat,, quite damaging and can grab you, stuns you for some time.
@@ -833,7 +833,7 @@ Mobs that mostly focus on dealing RED damage, they are all a bit more frail than
SLEEP_CHECK_DEATH(attack_delay) //takes longer to slam on phase 2
for(var/turf/T in view(current_stage, src))//scales with stage, at stage 2 hits 2 tiles around
new /obj/effect/temp_visual/lovetown_shapes(T)
- HurtInTurf(T, list(), (rand(melee_damage_lower, melee_damage_upper)/2), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE) //30~40 damage
+ HurtInTurf(T, list(), (rand(melee_damage_lower, melee_damage_upper)/2), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //30~40 damage
switch(current_stage)
if(1)
icon_state = "lovetown_abomination_slam"
@@ -981,7 +981,7 @@ Mobs that mostly focus on dealing RED damage, they are all a bit more frail than
return
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/lovetown_whip(T)
- HurtInTurf(T, list(), lovewhip_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), lovewhip_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in T)
var/atom/throw_target = get_edge_target_turf(L, get_dir(L, src))
L.throw_at(throw_target, 200, 4)
@@ -1015,7 +1015,7 @@ Mobs that mostly focus on dealing RED damage, they are all a bit more frail than
can_act = TRUE
return
for(var/mob/living/carbon/human/H in view(7, get_turf(src)))
- H.apply_damage(35, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(35, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/lovetown_shapes(get_turf(TH))
TH.gib()
// animate(TH, pixel_y = pixel_y_before, time = 10, , easing = BACK_EASING | EASE_OUT, flags = ANIMATION_END_NOW) //animate the shape back when you add it Mel
diff --git a/ModularTegustation/tegu_mobs/lc13_resurgence_clan_mobs.dm b/ModularTegustation/tegu_mobs/lc13_resurgence_clan_mobs.dm
index 39a1186de734..6cbc089f5472 100644
--- a/ModularTegustation/tegu_mobs/lc13_resurgence_clan_mobs.dm
+++ b/ModularTegustation/tegu_mobs/lc13_resurgence_clan_mobs.dm
@@ -354,7 +354,7 @@
defender.ApplyLock(L)
if(ishuman(L))
var/mob/living/carbon/human/H = L
- H.apply_damage(10, BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(10, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
to_chat(H, span_warning("You get shocked by the electic fields"))
/datum/status_effect/locked
@@ -550,7 +550,7 @@
if (potential_target && target && potential_target != target)
remove_beam()
- target = potential_target
+ FindTarget(list(potential_target), TRUE)
if(ai_controller)
ai_controller.current_movement_target = target
@@ -677,6 +677,6 @@
if (potential_target && target && potential_target != target)
remove_beam()
- target = potential_target
+ FindTarget(list(potential_target), TRUE)
if(ai_controller)
ai_controller.current_movement_target = target
diff --git a/ModularTegustation/tegu_mobs/necromancer.dm b/ModularTegustation/tegu_mobs/necromancer.dm
index 72ada7416ed0..865413bd797a 100644
--- a/ModularTegustation/tegu_mobs/necromancer.dm
+++ b/ModularTegustation/tegu_mobs/necromancer.dm
@@ -294,7 +294,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.apply_damage(lightning_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(lightning_damage, src)
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.electrocution_animation(4)
@@ -329,14 +329,14 @@
var/mob/living/M = AM
if(!faction_check_mob(M))
M.Knockdown(1)
- M.apply_damage(50, RED_DAMAGE, null, M.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ M.deal_damage(50, RED_DAMAGE, src)
to_chat(M, span_userdanger("You're slammed into the floor by [src]!"))
else
new /obj/effect/temp_visual/gravpush(get_turf(AM), get_dir(src, AM))
if(isliving(AM))
var/mob/living/M = AM
if(!faction_check_mob(M))
- M.apply_damage(25, RED_DAMAGE, null, M.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ M.deal_damage(25, RED_DAMAGE, src)
to_chat(M, span_userdanger("You're thrown back by [src]!"))
AM.safe_throw_at(throwtarget, ((clamp((5 - (clamp(distfromcaster - 2, 0, distfromcaster))), 3, 5))), 1, src, force = MOVE_FORCE_VERY_STRONG, gentle = TRUE)
@@ -649,7 +649,7 @@
if(currently_affected >= max_affected)
return
currently_affected += 1
- L.apply_damage(bolt_power/500, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(bolt_power/500, PALE_DAMAGE, user)
to_chat(L, span_userdanger("You've been hit by a magical lightning bolt!"))
if(ishuman(L))
var/mob/living/carbon/human/H = L
diff --git a/ModularTegustation/tegu_mobs/necromancer_mobs.dm b/ModularTegustation/tegu_mobs/necromancer_mobs.dm
index 3c0bb26d9b09..29fadf9ee507 100644
--- a/ModularTegustation/tegu_mobs/necromancer_mobs.dm
+++ b/ModularTegustation/tegu_mobs/necromancer_mobs.dm
@@ -56,6 +56,6 @@
for(var/mob/living/L in TC)
if("necromancer" in L.faction)
continue
- L.apply_damage(25, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(25, BLACK_DAMAGE, src)
to_chat(L, span_userdanger("You're hit by a death field!"))
SLEEP_CHECK_DEATH(1.5)
diff --git a/ModularTegustation/tegu_traitor_code/velvet_fu.dm b/ModularTegustation/tegu_traitor_code/velvet_fu.dm
index 3293b891640c..7c101272d7d8 100644
--- a/ModularTegustation/tegu_traitor_code/velvet_fu.dm
+++ b/ModularTegustation/tegu_traitor_code/velvet_fu.dm
@@ -105,7 +105,7 @@
owner.visible_message(span_danger("[owner] suddenly twists and turns, what a strange stance!"), "You twist and turn, your twisted stance is done!")
owner.mind.martial_art.streak = "twisted_stance"
H.adjustStaminaLoss(-40)
- H.apply_damage(18, BRUTE, BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
+ H.deal_damage(18, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
/datum/martial_art/velvetfu/proc/twisted_stance(mob/living/carbon/user)
return // Empty return because we only want the button trigger
@@ -124,7 +124,7 @@
crit_wound.apply_wound(limb)
else
to_chat(A, span_danger("Your flying axe kick fails to cause [D] to bleed!"))
- D.apply_damage(10, BRUTE) // Slash!
+ D.deal_damage(10, BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE)) // Slash!
playsound(get_turf(A), 'sound/weapons/slice.ogg', 50, TRUE, -1)
return TRUE
@@ -134,7 +134,7 @@
D.visible_message(span_danger("[A] headbutted [D]!"), \
span_userdanger("You're headbutted by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You swiftly headbutt [D]!"))
- A.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
+ A.deal_damage(15, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
A.adjustStaminaLoss(60)
if(prob(80))
if(!D.stat)
@@ -142,7 +142,7 @@
D.Jitter(6 SECONDS)
else
to_chat(A, span_danger("You fail to stun [D]!"))
- D.apply_damage(10, A.get_attack_type(), BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
+ D.deal_damage(10, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
return TRUE
@@ -158,7 +158,7 @@
D.Knockdown(30)
else
to_chat(A, span_danger("You fail to knock [D] down!"))
- D.apply_damage(15, A.get_attack_type(), BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
+ D.deal_damage(15, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1)
return TRUE
@@ -172,7 +172,7 @@
var/obj/item/bodypart/limb = D.get_bodypart(ran_zone(A.zone_selected)) // Guaranteed, unlike Flying Axe Kick
var/datum/wound/slash/moderate/crit_wound = new
crit_wound.apply_wound(limb)
- D.apply_damage(30, BRUTE) // Slash!
+ D.deal_damage(30, BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE)) // Slash!
playsound(get_turf(A), 'sound/weapons/bladeslice.ogg', 50, TRUE, -1)
return TRUE
@@ -191,7 +191,7 @@
if(D.body_position == LYING_DOWN)
bonus_damage += 5
picked_hit_type = "iron hooved"
- D.apply_damage(bonus_damage, A.get_attack_type())
+ D.deal_damage(bonus_damage, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
D.visible_message(span_danger("[A] [picked_hit_type]ed [D]!"), \
span_userdanger("You're [picked_hit_type]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You [picked_hit_type] [D]!"))
@@ -214,7 +214,7 @@
if(D.body_position == LYING_DOWN)
bonus_damage += 5
picked_hit_type = "iron hooved"
- D.apply_damage(bonus_damage, A.get_attack_type())
+ D.deal_damage(bonus_damage, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
D.visible_message(span_danger("[A] [picked_hit_type]ed [D]!"), \
span_userdanger("You're [picked_hit_type]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You [picked_hit_type] [D]!"))
@@ -237,7 +237,7 @@
if(D.body_position == LYING_DOWN)
bonus_damage += 8
picked_hit_type = "iron hooved"
- D.apply_damage(bonus_damage, A.get_attack_type())
+ D.deal_damage(bonus_damage, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
D.visible_message(span_danger("[A] [picked_hit_type]ed [D]!"), \
span_userdanger("You're [picked_hit_type]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You [picked_hit_type] [D]!"))
diff --git a/code/__DEFINES/damage.dm b/code/__DEFINES/damage.dm
new file mode 100644
index 000000000000..1fc9fed76719
--- /dev/null
+++ b/code/__DEFINES/damage.dm
@@ -0,0 +1,33 @@
+// Ahead are a bunch of bitflags that can be sent in the "flags" argument for deal_damage() to customize the behaviour of damage.
+/// Set this bitflag to prevent deal_damage from calling PreDamageReaction.
+#define DAMAGE_FORCED (1 << 0)
+/// Set this bitflag to make the source of the damage untrackable (thus, mobs do not aggro onto the target from it, and PostDamageReaction will not have a source when it runs)
+#define DAMAGE_UNTRACKABLE (1 << 1)
+/// Set this bitflag to prevent damage from being spread across the body. Irrelevant for anything but carbons.
+#define DAMAGE_NO_SPREAD (1 << 2)
+/// Set this bitflag to allow WHITE/BLACK damage to resane.
+#define DAMAGE_WHITE_HEALABLE (1 << 3)
+/// Set this bitflag to ignore the armour check and godmode (yes, for some reason you can ignore godmode. do not blame this on me)
+#define DAMAGE_PIERCING (1 << 4)
+
+/*
+These flags are for the "attack_type" argument in deal_damage, so you can discern and act upon the difference between damage incoming from a melee hit or from a bullet and so on.
+You can TECHNICALLY have "hybrid" damages by setting multiple of them. It makes sense, for example, for Blue Shepherd's autoattack to be exclusively ATTACK_TYPE_MELEE, but his spinning slash to
+be both ATTACK_TYPE_MELEE and ATTACK_TYPE_SPECIAL.
+*/
+/// Set this bitflag to mark the attack as melee (EGO melee weapons, fisticuffs, an abnormality's basic attack...)
+#define ATTACK_TYPE_MELEE (1 << 0)
+/// Set this bitflag to mark the attack as ranged (firearms, bows, etc...)
+#define ATTACK_TYPE_RANGED (1 << 1)
+/// Set this bitflag to mark the attack as a thrown attack (javelins, boomerangs, something flung by Sirocco...)
+#define ATTACK_TYPE_THROWING (1 << 2)
+/// Set this bitflag to mark the attack as a special attack (Fragment of the Universe's song, Temperance Insanity pulse damage, EGO special abilities, most Abnormality unique attacks... Very broad definition)
+#define ATTACK_TYPE_SPECIAL (1 << 3)
+/// Set this bitflag to mark the attack as a status effect (Melting Love's DoT, damage from burning, etc...)
+#define ATTACK_TYPE_STATUS (1 << 4)
+/// Set this bitflag to mark the attack as coming from the environment (stepping on a fire turf, stepping on a Hypocrisy trap, drowning in the Great Lakes, etc...)
+#define ATTACK_TYPE_ENVIRONMENT (1 << 5)
+/// Set this bitflag when the attack is a "counter" or "riposte". (White Fixer's damage reflection, Sanguine Flame's deflect...)
+#define ATTACK_TYPE_COUNTER (1 << 6)
+/// This is for when the damage is coming from somewhere that doesn't easily fit one of the other categories, but you'd still like to mark its type...
+#define ATTACK_TYPE_OTHER (1 << 7)
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 5649d4e2c9df..487bef3474f9 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -406,6 +406,8 @@
///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone)
#define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage"
+///from base of /mob/living/proc/apply_damage(), happens after the mob has taken damage: (damage, damagetype, def_zone)
+#define COMSIG_MOB_AFTER_APPLY_DAMGE "mob_after_apply_damage"
/// Blocks the damage from being taken if this is returned in a signal handler
#define COMPONENT_MOB_DENY_DAMAGE (1<<0)
///from base of /mob/throw_item(): (atom/target)
@@ -574,6 +576,9 @@
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMSIG_HOSTILE_LOSTTARGET "hostile_losttarget"
#define COMPONENT_HOSTILE_NO_ATTACK (1<<0)
+#define COMSIG_HOSTILE_GAINEDTARGET "hostile_gainedtarget" // (mob/living/simple_animal/hostile/source, atom/new_target)
+ #define COMPONENT_HOSTILE_REFUSE_AGGRO (1<<0)
+
/// a hostile has started their patrol (datum/source, mob/living/simple_animal/hostile/mover, turf/target_location)
#define COMSIG_GLOB_PATROL_START "!patrol_start"
#define COMSIG_PATROL_START "patrol_start"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index cf23bea9535a..366027ca7729 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -660,11 +660,13 @@ GLOBAL_LIST_EMPTY(species_list)
* * hurt_structure (optional) If this damage applies to structures as well.
* * break_not_destroy (optional) If this is TRUE, then the damage will not DESTROY structures, only break them.
* * attack_direction (optional) Is the direction of the attack relative to the mecha that gets hit by this attack, for directional armor.
+ * * flags (optional) Bitflags from code\__DEFINES\damage.dm. For example, flags = (DAMAGE_FORCED | DAMAGE_PIERCING) will prevent the damage from being cancelled by a PreDamageReaction() and will ignore godmode and armour/damagecoeff effects on damage.
+ * * attack_type (optional) Bitflags from code\__DEFINES\damage.dm. For example, attack_type = (ATTACK_TYPE_MELEE) will mark the attack as a melee attack, or (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL) as both ranged and special.
*
* returns:
* * hit_list - A list containing all things hit by this proc.
*/
-/mob/proc/HurtInTurf(turf/target, list/hit_list = list(), damage = 0, damage_type = RED_DAMAGE, def_zone = null, check_faction = FALSE, exact_faction_match = FALSE, hurt_mechs = FALSE, mech_damage = 0, hurt_hidden = FALSE, hurt_structure = FALSE, break_not_destroy = FALSE, attack_direction = null)
+/mob/proc/HurtInTurf(turf/target, list/hit_list = list(), damage = 0, damage_type = RED_DAMAGE, def_zone = null, check_faction = FALSE, exact_faction_match = FALSE, hurt_mechs = FALSE, mech_damage = 0, hurt_hidden = FALSE, hurt_structure = FALSE, break_not_destroy = FALSE, attack_direction = null, flags = null, attack_type = null)
// Types that should never be hit by HurtInTurf
var/static/list/exclude = typecacheof(list(/obj/machinery/navbeacon/wayfinding, /obj/structure/disposalpipe, /obj/structure/lattice, /obj/machinery/cryopod, /obj/structure/sign, /obj/machinery/button, /obj/machinery/light, /obj/structure/extinguisher_cabinet, /obj/machinery/containment_panel, /obj/machinery/computer/security/telescreen, /obj/machinery/facility_holomap, /obj/structure/fans/tiny, /obj/machinery/requests_console))
var/static/list/hiding_places = typecacheof(list(/obj/structure/closet, /obj/structure/bodycontainer, /obj/machinery/disposal, /obj/machinery/cryopod, /obj/machinery/sleeper, /obj/machinery/fat_sucker))
@@ -684,7 +686,7 @@ GLOBAL_LIST_EMPTY(species_list)
if(faction_check_mob(L, exact_faction_match))
continue
if(damage)
- L.apply_damage(damage, damage_type, def_zone, L.run_armor_check(def_zone, damage_type), FALSE, TRUE)
+ L.deal_damage(damage, damage_type, source = src, flags = flags, attack_type = attack_type)
. += L
if(hurt_mechs || hurt_hidden || hurt_structure)
for(var/obj/O in target)
@@ -718,7 +720,7 @@ GLOBAL_LIST_EMPTY(species_list)
if(faction_check_mob(L, exact_faction_match))
continue
if(damage)
- L.apply_damage(damage, damage_type, def_zone, L.run_armor_check(def_zone, damage_type), FALSE, TRUE)
+ L.deal_damage(damage, damage_type, source = src, flags = flags, attack_type = attack_type)
. += L
if(hurt_structure && (isstructure(O) || ismachinery(O)))
if(O.resistance_flags & INDESTRUCTIBLE)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index b35f84dabffb..29631d6a27bd 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -286,7 +286,7 @@
var/obj/item/ego_weapon/theweapon = I
damage *= theweapon.force_multiplier
- apply_damage(damage, I.damtype, white_healable = TRUE)
+ deal_damage(damage, I.damtype, source = user, flags = (DAMAGE_WHITE_HEALABLE), attack_type = (ATTACK_TYPE_MELEE))
if(I.damtype in list(RED_DAMAGE, BLACK_DAMAGE, PALE_DAMAGE))
if(prob(33))
I.add_mob_blood(src)
diff --git a/code/datums/ai/sanity/_sanityloss_controller.dm b/code/datums/ai/sanity/_sanityloss_controller.dm
index fde0b0e70e21..8b475d965e8b 100644
--- a/code/datums/ai/sanity/_sanityloss_controller.dm
+++ b/code/datums/ai/sanity/_sanityloss_controller.dm
@@ -825,7 +825,7 @@
for(var/mob/living/carbon/human/H in view(7, human_pawn))
if(HAS_TRAIT(H, TRAIT_COMBATFEAR_IMMUNE))
continue
- H.apply_damage(sanity_damage, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE))
+ H.deal_damage(sanity_damage, WHITE_DAMAGE, human_pawn, flags = (DAMAGE_FORCED))
/datum/ai_controller/insane/wander
lines_type = /datum/ai_behavior/say_line/insanity_lines/insanity_wander
diff --git a/code/datums/ai/sanity/sanityloss_behaviors.dm b/code/datums/ai/sanity/sanityloss_behaviors.dm
index d8784d279704..5e3e93819d6f 100644
--- a/code/datums/ai/sanity/sanityloss_behaviors.dm
+++ b/code/datums/ai/sanity/sanityloss_behaviors.dm
@@ -20,7 +20,7 @@
continue
if(HAS_TRAIT(H, TRAIT_COMBATFEAR_IMMUNE))
continue
- H.apply_damage(sanity_damage, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE))
+ H.deal_damage(sanity_damage, WHITE_DAMAGE, living_pawn, flags = (DAMAGE_FORCED))
/datum/ai_behavior/say_line/insanity_lines/insanity_release
line_type = "release"
diff --git a/code/datums/components/bane.dm b/code/datums/components/bane.dm
index 8d7c7a08a65f..b44705a6f1c5 100644
--- a/code/datums/components/bane.dm
+++ b/code/datums/components/bane.dm
@@ -46,4 +46,4 @@
return
var/extra_damage = max(0, source.force * damage_multiplier)
- target.apply_damage(extra_damage, source.damtype, attacker.zone_selected)
+ target.deal_damage(extra_damage, source.damtype, source = attacker, flags = (DAMAGE_FORCED), def_zone = attacker.zone_selected)
diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm
index a05c8db8eee9..9c1ab1d545b6 100644
--- a/code/datums/components/butchering.dm
+++ b/code/datums/components/butchering.dm
@@ -78,7 +78,7 @@
H.visible_message("[user] slits [H]'s throat!", \
"[user] slits your throat...")
log_combat(user, H, "finishes slicing the throat of")
- H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec
+ H.deal_damage(source.force, BRUTE, source = user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = CANT_WOUND) // easy tiger, we'll get to that in a sec
var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD)
if(slit_throat)
var/datum/wound/slash/critical/screaming_through_a_slit_throat = new
diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm
index eeca06eda277..809bdb0e9dd5 100644
--- a/code/datums/components/jousting.dm
+++ b/code/datums/components/jousting.dm
@@ -55,7 +55,7 @@
var/msg
if(damage)
msg += "[user] [sharp? "impales" : "slams into"] [target] [sharp? "on" : "with"] their [parent]"
- target.apply_damage(damage, BRUTE, user.zone_selected, 0)
+ target.deal_damage(damage, BRUTE, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = user.zone_selected)
if(prob(knockdown_chance))
msg += " and knocks [target] [target_buckled? "off of [target.buckled]" : "down"]"
if(target_buckled)
diff --git a/code/datums/diseases/bee_spawn.dm b/code/datums/diseases/bee_spawn.dm
index 40e85015ee8c..f8bb4ffa05d3 100644
--- a/code/datums/diseases/bee_spawn.dm
+++ b/code/datums/diseases/bee_spawn.dm
@@ -22,7 +22,7 @@
return
var/mob/living/carbon/human/H = affected_mob
- H.apply_damage(round(stage/2), RED_DAMAGE, null, H.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(round(stage/2), RED_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS))
if(H.health <= 0)
var/turf/T = get_turf(H)
diff --git a/code/datums/diseases/orange_tree.dm b/code/datums/diseases/orange_tree.dm
index 9dada8accf40..55e0846a56b6 100644
--- a/code/datums/diseases/orange_tree.dm
+++ b/code/datums/diseases/orange_tree.dm
@@ -44,7 +44,7 @@
cure(FALSE)
return
- H.apply_damage((H.maxSanity * 0.06), WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ H.deal_damage((H.maxSanity * 0.06), WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS))
if(prob(25))
var/turf/T = get_turf(H)
new /obj/effect/temp_visual/dancing_lights(T)
diff --git a/code/datums/elements/caltrop.dm b/code/datums/elements/caltrop.dm
index 11e548c19577..0a1204c1d006 100644
--- a/code/datums/elements/caltrop.dm
+++ b/code/datums/elements/caltrop.dm
@@ -79,5 +79,5 @@
H.visible_message(span_danger("[H] steps on [caltrop]."), \
span_userdanger("You step on [caltrop]!"))
- H.apply_damage(damage, BRUTE, picked_def_zone, wound_bonus = CANT_WOUND)
+ H.deal_damage(damage, BRUTE, attack_type = (ATTACK_TYPE_ENVIRONMENT), def_zone = picked_def_zone, wound_bonus = CANT_WOUND)
H.Paralyze(60)
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 186313c3c263..41f8a5129df0 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -38,7 +38,7 @@
span_userdanger("You're [atk_verb]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You [atk_verb]ed [D]!"))
- D.apply_damage(damage, STAMINA, affecting, armor_block)
+ D.deal_damage(damage, STAMINA, source = attacker_human, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
log_combat(A, D, "punched (boxing) ")
if(D.getStaminaLoss() > 50 && istype(D.mind?.martial_art, /datum/martial_art/boxing))
var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 58c5ab595a30..567939f47b45 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -50,7 +50,7 @@
span_userdanger("You're slammed into the ground by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A)
to_chat(A, span_danger("You slam [D] into the ground!"))
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, TRUE, -1)
- D.apply_damage(10, BRUTE)
+ D.deal_damage(10, BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE))
D.Paralyze(120)
log_combat(A, D, "slammed (CQC)")
return TRUE
@@ -65,7 +65,7 @@
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1)
var/atom/throw_target = get_edge_target_turf(D, A.dir)
D.throw_at(throw_target, 1, 14, A)
- D.apply_damage(10, A.get_attack_type())
+ D.deal_damage(10, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
log_combat(A, D, "kicked (CQC)")
if(D.IsParalyzed() && !D.stat)
log_combat(A, D, "knocked out (Head kick)(CQC)")
@@ -117,7 +117,7 @@
if(I && D.temporarilyRemoveItemFromInventory(I))
A.put_in_hands(I)
D.adjustStaminaLoss(50)
- D.apply_damage(25, A.get_attack_type())
+ D.deal_damage(25, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
return TRUE
/datum/martial_art/cqc/grab_act(mob/living/A, mob/living/D)
@@ -151,7 +151,7 @@
if(D.body_position == LYING_DOWN)
bonus_damage += 5
picked_hit_type = "stomp"
- D.apply_damage(bonus_damage, BRUTE)
+ D.deal_damage(bonus_damage, BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE))
if(picked_hit_type == "kick" || picked_hit_type == "stomp")
playsound(get_turf(D), 'sound/weapons/cqchit2.ogg', 50, TRUE, -1)
else
@@ -165,7 +165,7 @@
span_userdanger("Your legs are sweeped by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A)
to_chat(A, span_danger("You leg sweep [D]!"))
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
- D.apply_damage(10, BRUTE)
+ D.deal_damage(10, BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE))
D.Paralyze(60)
log_combat(A, D, "sweeped (CQC)")
return TRUE
@@ -187,7 +187,7 @@
if(I && D.temporarilyRemoveItemFromInventory(I))
A.put_in_hands(I)
D.Jitter(2)
- D.apply_damage(5, A.get_attack_type())
+ D.deal_damage(5, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
else
D.visible_message(span_danger("[A] fails to disarm [D]!"), \
span_userdanger("You're nearly disarmed by [A]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, A)
diff --git a/code/datums/martial/cuckoopunch.dm b/code/datums/martial/cuckoopunch.dm
index 286329a08f7d..e33f19fd2ae4 100644
--- a/code/datums/martial/cuckoopunch.dm
+++ b/code/datums/martial/cuckoopunch.dm
@@ -126,14 +126,13 @@
return TRUE
log_combat(A, D, "punched")
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
- var/armor_block = D.run_armor_check(affecting, RED_DAMAGE)
var/picked_hit_type = pick("punch", "kick")
var/bonus_damage = 0
if(D.body_position == LYING_DOWN)
bonus_damage += 10
picked_hit_type = "stomp"
if(A.has_status_effect(/datum/status_effect/hunter))
- D.apply_damage(rand(25,30) + bonus_damage, RED_DAMAGE, affecting, armor_block)
+ D.deal_damage(rand(25,30) + bonus_damage, RED_DAMAGE, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
if(ishuman(D) && D.stat != DEAD && prob(5))
var/mob/living/carbon/human/human_target = D
var/obj/item/bodypart/chest/LC = human_target.get_bodypart(BODY_ZONE_CHEST)
@@ -144,7 +143,7 @@
log_game("[key_name(human_target)] was infected by a niaojia-ren at [loc_name(T)]")
else
to_chat(A, span_warning("You attack pathetically, re-enter your territory!"))
- D.apply_damage(rand(10,14) + bonus_damage, RED_DAMAGE, affecting, armor_block)
+ D.deal_damage(rand(10,14) + bonus_damage, RED_DAMAGE, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
playsound(get_turf(D), 'sound/abnormalities/big_wolf/Wolf_Scratch.ogg', 50, TRUE, -1)
if(picked_hit_type == "kick" || picked_hit_type == "stomp")
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
@@ -173,9 +172,9 @@
to_chat(A, span_danger("You [atk_verb] [D] with such inhuman strength!"))
playsound(D, 'sound/effects/meteorimpact.ogg', 25, TRUE, -1)
if(A.has_status_effect(/datum/status_effect/hunter))
- D.apply_damage(150, RED_DAMAGE)
+ D.deal_damage(150, RED_DAMAGE, source = A, attack_type = (ATTACK_TYPE_MELEE))
else
- D.apply_damage(75, RED_DAMAGE)
+ D.deal_damage(75, RED_DAMAGE, source = A, attack_type = (ATTACK_TYPE_MELEE))
to_chat(A, span_warning("You attack pathetically, re-enter your territory!"))
if(atk_verb)
log_combat(A, D, "[atk_verb] (Cuckoo Punch)")
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index b9c426008769..ce9ae526b9ad 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -87,12 +87,11 @@
if(D.stat || D.IsParalyzed())
return FALSE
var/obj/item/bodypart/affecting = D.get_bodypart(BODY_ZONE_CHEST)
- var/armor_block = D.run_armor_check(affecting, MELEE)
D.visible_message(span_warning("[A] leg sweeps [D]!"), \
span_userdanger("Your legs are sweeped by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A)
to_chat(A, span_danger("You leg sweep [D]!"))
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
- D.apply_damage(rand(20,30), STAMINA, affecting, armor_block)
+ D.deal_damage(rand(20,30), STAMINA, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
D.Knockdown(60)
log_combat(A, D, "leg sweeped")
return TRUE
@@ -113,7 +112,7 @@
span_userdanger("Your neck is karate chopped by [A], rendering you unable to speak!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You karate chop [D]'s neck, rendering [D.p_them()] unable to speak!"))
playsound(get_turf(A), 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
- D.apply_damage(5, A.get_attack_type())
+ D.deal_damage(5, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
if (iscarbon(D))
var/mob/living/carbon/carbon_defender = D
if(carbon_defender.silent <= 10)
@@ -132,13 +131,12 @@
return TRUE
log_combat(A, D, "punched")
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
- var/armor_block = D.run_armor_check(affecting, MELEE)
var/picked_hit_type = pick("punch", "kick")
var/bonus_damage = 0
if(D.body_position == LYING_DOWN)
bonus_damage += 5
picked_hit_type = "stomp"
- D.apply_damage(rand(5,10) + bonus_damage, A.get_attack_type(), affecting, armor_block)
+ D.deal_damage(rand(5,10) + bonus_damage, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
if(picked_hit_type == "kick" || picked_hit_type == "stomp")
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
playsound(get_turf(D), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
@@ -155,14 +153,13 @@
if(check_streak(A,D))
return TRUE
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
- var/armor_block = D.run_armor_check(affecting, MELEE)
if(D.body_position == STANDING_UP)
D.visible_message(span_danger("[A] reprimands [D]!"), \
span_userdanger("You're slapped by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_danger("You jab [D]!"))
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
- D.apply_damage(rand(5,10), STAMINA, affecting, armor_block)
+ D.deal_damage(rand(5,10), STAMINA, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
log_combat(A, D, "punched nonlethally")
if(D.body_position == LYING_DOWN)
D.visible_message(span_danger("[A] reprimands [D]!"), \
@@ -170,7 +167,7 @@
to_chat(A, span_danger("You stomp [D]!"))
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
playsound(D, 'sound/effects/hit_punch.ogg', 50, TRUE, -1)
- D.apply_damage(rand(10,15), STAMINA, affecting, armor_block)
+ D.deal_damage(rand(10,15), STAMINA, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
log_combat(A, D, "stomped nonlethally")
if(prob(D.getStaminaLoss()))
D.visible_message(span_warning("[D] sputters and recoils in pain!"), span_userdanger("You recoil in pain as you are jabbed in a nerve!"))
diff --git a/code/datums/martial/mushpunch.dm b/code/datums/martial/mushpunch.dm
index 0cb860a8415e..ca598c55bce9 100644
--- a/code/datums/martial/mushpunch.dm
+++ b/code/datums/martial/mushpunch.dm
@@ -13,7 +13,7 @@
D.visible_message(span_danger("[A] [atk_verb]ed [D] with such inhuman strength that it sends [D.p_them()] flying backwards!"), \
span_userdanger("You're [atk_verb]ed by [A] with such inhuman strength that it sends you flying backwards!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A)
to_chat(A, span_danger("You [atk_verb] [D] with such inhuman strength that it sends [D.p_them()] flying backwards!"))
- D.apply_damage(rand(15,30), A.get_attack_type())
+ D.deal_damage(rand(15,30), A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
playsound(D, 'sound/effects/meteorimpact.ogg', 25, TRUE, -1)
var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time.
diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm
index 4ac45b6a2bdb..a4b72899a0a1 100644
--- a/code/datums/martial/plasma_fist.dm
+++ b/code/datums/martial/plasma_fist.dm
@@ -107,7 +107,7 @@
to_chat(A, "The explosion knocks your soul out of your body!")
A.ghostize(FALSE) //prevents... horrible memes just believe me
- A.apply_damage(rand(50,70), BRUTE)
+ A.deal_damage(rand(50,70), BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
addtimer(CALLBACK(src, PROC_REF(Apotheosis_end), A), 6 SECONDS)
playsound(boomspot, 'sound/weapons/punch1.ogg', 50, TRUE, -1)
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 9a1511d43d83..6a4a345630da 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -47,8 +47,8 @@
span_userdanger("You're [atk_verb]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A)
to_chat(A, span_danger("You [atk_verb] [D]!"))
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, TRUE, -1)
- D.apply_damage(rand(5,10), A.get_attack_type(), BODY_ZONE_HEAD)
- A.apply_damage(rand(5,10), A.get_attack_type(), BODY_ZONE_HEAD)
+ D.deal_damage(rand(5,10), A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_HEAD)
+ A.deal_damage(rand(5,10), A.get_attack_type(), flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD)
if (iscarbon(D))
var/mob/living/carbon/defender = D
if(!istype(defender.head,/obj/item/clothing/head/helmet/) && !istype(defender.head,/obj/item/clothing/head/hardhat))
@@ -61,7 +61,7 @@
D.visible_message(span_danger("[A] [atk_verb]s [D] with such inhuman strength that it sends [D.p_them()] flying backwards!"), \
span_userdanger("You're [atk_verb]ed by [A] with such inhuman strength that it sends you flying backwards!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A)
to_chat(A, span_danger("You [atk_verb] [D] with such inhuman strength that it sends [D.p_them()] flying backwards!"))
- D.apply_damage(rand(15,30), A.get_attack_type())
+ D.deal_damage(rand(15,30), A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE))
playsound(get_turf(D), 'sound/effects/meteorimpact.ogg', 25, TRUE, -1)
var/throwtarget = get_edge_target_turf(A, get_dir(A, get_step_away(D, A)))
D.throw_at(throwtarget, 4, 2, A)//So stuff gets tossed around at the same time.
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 31c5db0ef6dc..7c70b659797c 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -35,7 +35,7 @@
to_chat(A, "You [atk_verb] [D]!")
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(A, D, "strong punched (Sleeping Carp)")
- D.apply_damage(20, A.get_attack_type(), affecting)
+ D.deal_damage(20, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
return
///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
@@ -46,7 +46,7 @@
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
var/atom/throw_target = get_edge_target_turf(D, A.dir)
D.throw_at(throw_target, 7, 14, A)
- D.apply_damage(15, A.get_attack_type(), BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
+ D.deal_damage(15, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND)
log_combat(A, D, "launchkicked (Sleeping Carp)")
return
@@ -55,14 +55,14 @@
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, TRUE, -1)
if(D.body_position == STANDING_UP)
- D.apply_damage(10, A.get_attack_type(), BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
- D.apply_damage(40, STAMINA, BODY_ZONE_HEAD)
+ D.deal_damage(10, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
+ D.deal_damage(40, STAMINA, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_HEAD)
D.Knockdown(40)
D.visible_message("[A] kicks [D] in the head, sending them face first into the floor!", \
"You are kicked in the head by [A], sending you crashing to the floor!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
else
- D.apply_damage(5, A.get_attack_type(), BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
- D.apply_damage(40, STAMINA, BODY_ZONE_HEAD)
+ D.deal_damage(5, A.get_attack_type(), source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_HEAD, wound_bonus = CANT_WOUND)
+ D.deal_damage(40, STAMINA, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_HEAD)
D.drop_all_held_items()
D.visible_message("[A] kicks [D] in the head!", \
"You are kicked in the head by [A]!", "You hear a sickening sound of flesh hitting flesh!", COMBAT_MESSAGE_RANGE, A)
@@ -86,7 +86,7 @@
D.visible_message("[A] [atk_verb]s [D]!", \
"[A] [atk_verb]s you!", null, null, A)
to_chat(A, "You [atk_verb] [D]!")
- D.apply_damage(rand(10,15), BRUTE, affecting, wound_bonus = CANT_WOUND)
+ D.deal_damage(rand(10,15), BRUTE, source = A, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, wound_bonus = CANT_WOUND)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1)
log_combat(A, D, "punched (Sleeping Carp)")
return TRUE
@@ -199,7 +199,7 @@
user.Paralyze(60)
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD)
+ H.deal_damage(2*force, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD)
else
user.take_bodypart_damage(2*force)
return
diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm
index 5b7ad5f1c5de..792036d55a1e 100644
--- a/code/datums/materials/basemats.dm
+++ b/code/datums/materials/basemats.dm
@@ -8,7 +8,7 @@
value_per_unit = 0.0025
/datum/material/iron/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
+ victim.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
///Breaks extremely easily but is transparent.
@@ -26,7 +26,7 @@
armor_modifiers = list(MELEE = 0.2, BULLET = 0.2, LASER = 0, ENERGY = 1, BOMB = 0, BIO = 0.2, RAD = 0.2, FIRE = 1, ACID = 0.2)
/datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch
+ victim.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch
return TRUE
/*
@@ -45,7 +45,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
beauty_modifier = 0.075
/datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
+ victim.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
///Slight force increase
@@ -61,7 +61,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1.1)
/datum/material/gold/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
+ victim.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
///Has no special properties
@@ -77,7 +77,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
armor_modifiers = list(MELEE = 1.3, BULLET = 1.3, LASER = 0.6, ENERGY = 1, BOMB = 1.2, BIO = 1, RAD = 1, FIRE = 1, ACID = 1)
/datum/material/diamond/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
+ victim.deal_damage(15, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 7)
return TRUE
///Is slightly radioactive (not anymore)
@@ -168,7 +168,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
armor_modifiers = list(MELEE = 1.35, BULLET = 1.3, LASER = 1.3, ENERGY = 1.25, BOMB = 1.25, BIO = 1, RAD = 1, FIRE = 0.7, ACID = 1)
/datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
+ victim.deal_damage(15, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 7)
return TRUE
/datum/material/runite
@@ -183,7 +183,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
armor_modifiers = list(MELEE = 1.35, BULLET = 2, LASER = 0.5, ENERGY = 1.25, BOMB = 1.25, BIO = 1, RAD = 1, FIRE = 1.4, ACID = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle.
/datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
+ victim.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 10)
return TRUE
///Force decrease
@@ -236,7 +236,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
wooden.resistance_flags &= ~FLAMMABLE
/datum/material/wood/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
+ victim.deal_damage(5, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD)
victim.reagents.add_reagent(/datum/reagent/cellulose, rand(8, 12))
source_item?.reagents?.add_reagent(/datum/reagent/cellulose, source_item.reagents.total_volume*(2/5))
@@ -255,7 +255,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
armor_modifiers = list(MELEE = 1.5, BULLET = 1.5, LASER = 1.3, ENERGY = 1.3, BOMB = 1, BIO = 1, RAD = 1, FIRE = 2.5, ACID = 1)
/datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
+ victim.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 10)
return TRUE
///RPG Magic.
@@ -281,7 +281,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
qdel(source.GetComponent(/datum/component/fantasy))
/datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
+ victim.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 10)
return TRUE
//formed when freon react with o2, emits a lot of plasma when heated
@@ -321,7 +321,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
armor_modifiers = list(MELEE = 1.35, BULLET = 1.3, LASER = 1.3, ENERGY = 1.25, BOMB = 0.7, BIO = 1, RAD = 1, FIRE = 1.3, ACID = 1)
/datum/material/metalhydrogen/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
- victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
+ victim.deal_damage(15, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 7)
return TRUE
/datum/material/otherworld_crystal
@@ -396,7 +396,7 @@ Unless you know what you're doing, only use the first three numbers. They're in
/datum/material/runedmetal/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
victim.reagents.add_reagent(/datum/reagent/fuel/unholywater, rand(8, 12))
- victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
+ victim.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
/datum/material/bronze
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index 3139780ece17..40c319930097 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -503,7 +503,7 @@
stack_trace("HARS mutation head regeneration failed! (usually caused by headless syndrome having a head)")
return TRUE
owner.dna.species.regenerate_organs(owner, replace_current = FALSE, excluded_zones = list(BODY_ZONE_CHEST)) //replace_current needs to be FALSE to prevent weird adding and removing mutation healing
- owner.apply_damage(damage = 50, damagetype = BRUTE, def_zone = BODY_ZONE_HEAD) //and this to DISCOURAGE organ farming, or at least not make it free.
+ owner.deal_damage(50, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD) //and this to DISCOURAGE organ farming, or at least not make it free.
owner.visible_message("[owner]'s head returns with a sickening crunch!", "Your head regrows with a sickening crack! Ouch.")
new /obj/effect/gibspawner/generic(get_turf(owner), owner)
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index a5b8de4a14b8..1ddaab43589f 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -1159,7 +1159,7 @@
var/mult = 0.25
if(!ishuman(owner))
mult = 1//Non human mobs take 1 damage per stack
- owner.apply_damage(max(1, stacks * mult), FIRE, null, owner.run_armor_check(null, FIRE))
+ owner.deal_damage(max(1, stacks * mult), FIRE, attack_type = (ATTACK_TYPE_STATUS))
//Update burn appearance
/datum/status_effect/stacking/lc_burn/proc/Update_Burn_Overlay(mob/living/owner)
@@ -1305,7 +1305,7 @@
/datum/status_effect/stacking/pallid_noise/tick()
if(!ishuman(owner))
- owner.apply_damage(stacks, WHITE_DAMAGE, null, owner.run_armor_check(null, WHITE_DAMAGE))
+ owner.deal_damage(stacks, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
return
var/mob/living/carbon/human/status_holder = owner
status_holder.adjustSanityLoss(stacks * stacks)//sanity damage is the # of stacks squared
@@ -1411,8 +1411,8 @@
icon_state = "dark_flame"
/datum/status_effect/stacking/lc_burn/dark_flame/DealDamage()
- owner.apply_damage(stacks * 0.5, FIRE, null, owner.run_armor_check(null, BLACK_DAMAGE))
- owner.apply_damage(stacks * 0.5, WHITE_DAMAGE, null, owner.run_armor_check(null, BLACK_DAMAGE))
+ owner.deal_damage(stacks, FIRE, attack_type = (ATTACK_TYPE_STATUS), blocked = owner.run_armor_check(null, BLACK_DAMAGE))
+ owner.deal_damage(stacks, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS), blocked = owner.run_armor_check(null, BLACK_DAMAGE))
//Update burn appearance
/datum/status_effect/stacking/lc_burn/dark_flame/Update_Burn_Overlay(mob/living/owner)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 2c493db0b377..2bf571b4cc94 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -754,7 +754,7 @@
H.visible_message("[user] headbutts the airlock.", \
"You headbutt the airlock!")
H.Paralyze(100)
- H.apply_damage(10, BRUTE, BODY_ZONE_HEAD)
+ H.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD)
else
visible_message("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.")
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 4dc872c1bf1c..47497126994d 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -127,7 +127,7 @@
if(!(get_dist(src, attached) <= 1 && isturf(attached.loc)))
to_chat(attached, "The IV drip needle is ripped out of you!")
- attached.apply_damage(3, BRUTE, pick(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM))
+ attached.deal_damage(3, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = pick(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM))
attached = null
update_icon()
return PROCESS_KILL
diff --git a/code/game/objects/effects/abnormality.dm b/code/game/objects/effects/abnormality.dm
index 9751b7f47302..6c7f0fd6a956 100644
--- a/code/game/objects/effects/abnormality.dm
+++ b/code/game/objects/effects/abnormality.dm
@@ -69,7 +69,7 @@
for(var/mob/living/L in T.contents)
if(L in beenHit)
continue
- L.apply_damage(140, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(140, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
L.apply_dark_flame(14)
beenHit |= L
visible_message("[src] pierces through [L]!")
@@ -77,7 +77,7 @@
for(var/mob/living/L in nearMiss)
if(L in beenHit)
continue
- L.apply_damage(70, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(70, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
L.apply_dark_flame(6)
beenHit |= L
visible_message("[src] just barely brushes past [L]!")
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 520cb7d8100e..ea7a2027e214 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -630,7 +630,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
)
if(is_human_victim)
var/mob/living/carbon/human/U = M
- U.apply_damage(7, BRUTE, affecting)
+ U.deal_damage(7, BRUTE, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
else
M.take_bodypart_damage(7)
@@ -1070,10 +1070,10 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
victim.visible_message("[victim] looks like [victim.p_theyve()] just bit something they shouldn't have!", \
"OH GOD! Was that a crunch? That didn't feel good at all!!")
- victim.apply_damage(max(15, force), BRUTE, BODY_ZONE_HEAD, wound_bonus = 10, sharpness = TRUE)
+ victim.deal_damage(max(15, force), BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD, wound_bonus = 10, sharpness = TRUE)
victim.losebreath += 2
if(tryEmbed(victim.get_bodypart(BODY_ZONE_CHEST), TRUE, TRUE)) //and if it embeds successfully in their chest, cause a lot of pain
- victim.apply_damage(max(25, force*1.5), BRUTE, BODY_ZONE_CHEST, wound_bonus = 7, sharpness = TRUE)
+ victim.deal_damage(max(25, force*1.5), BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_CHEST, wound_bonus = 7, sharpness = TRUE)
victim.losebreath += 6
discover_after = FALSE
if(QDELETED(src)) // in case trying to embed it caused its deletion (say, if it's DROPDEL)
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 2ead0f4ba9f2..1a6d5c115cfb 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -719,7 +719,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.visible_message("After a few attempts, [user] manages to light [src].", "After a few attempts, you manage to light [src].")
else
var/hitzone = user.held_index_to_dir(user.active_hand_index) == "r" ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND
- user.apply_damage(5, FIRE, hitzone)
+ user.deal_damage(2, FIRE, flags = (DAMAGE_FORCED), def_zone = hitzone)
user.visible_message("After a few attempts, [user] manages to light [src] - however, [user.p_they()] burn [user.p_their()] finger in the process.", "You burn yourself while lighting the lighter!")
else
@@ -998,7 +998,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
vapetime -= vapedelay
if(prob(5))//small chance for the vape to break and deal damage if it's emagged
playsound(get_turf(src), 'sound/effects/pop_expl.ogg', 50, FALSE)
- M.apply_damage(20, FIRE, BODY_ZONE_HEAD)
+ M.deal_damage(6, FIRE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
M.Paralyze(300)
var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread
sp.set_up(5, 1, src)
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 0488193f64d7..d5259ccfe79a 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -529,7 +529,7 @@
H.visible_message("[H] thrashes wildly, clutching at [H.p_their()] chest!",
"You feel a horrible agony in your chest!")
H.set_heartattack(TRUE)
- H.apply_damage(50, FIRE, BODY_ZONE_CHEST)
+ H.deal_damage(20, FIRE, source = user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_CHEST)
log_combat(user, H, "overloaded the heart of", defib)
H.Paralyze(100)
H.Jitter(100)
diff --git a/code/game/objects/items/dehy_carp.dm b/code/game/objects/items/dehy_carp.dm
index 82019a6f2597..8d76b2541425 100644
--- a/code/game/objects/items/dehy_carp.dm
+++ b/code/game/objects/items/dehy_carp.dm
@@ -58,7 +58,7 @@
return SHAME
if(!QDELETED(H))
H.spawn_gibs()
- H.apply_damage(200, def_zone = BODY_ZONE_CHEST)
+ H.deal_damage(200, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_CHEST)
forceMove(get_turf(H)) //we move it back
icon = 'icons/mob/carp.dmi'
flick("carp_swell", src)
diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm
index d00aa0bdac32..3cd12c3eb642 100644
--- a/code/game/objects/items/devices/polycircuit.dm
+++ b/code/game/objects/items/devices/polycircuit.dm
@@ -50,7 +50,7 @@
else
to_chat(user, span_notice("You navigate the sharp edges of circuitry and remove a single board from [src]"))
else
- H.apply_damage(15, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ H.deal_damage(15, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
to_chat(user, span_warning("You give yourself a wicked cut on [src]'s many sharp corners and edges!"))
/obj/item/stack/circuit_stack/full
diff --git a/code/game/objects/items/devices/reverse_bear_trap.dm b/code/game/objects/items/devices/reverse_bear_trap.dm
index e4476cc7ca94..1ec6833a583d 100644
--- a/code/game/objects/items/devices/reverse_bear_trap.dm
+++ b/code/game/objects/items/devices/reverse_bear_trap.dm
@@ -108,7 +108,7 @@
jill.emote("scream")
playsound(src, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
playsound(src, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
- jill.apply_damage(9999, BRUTE, BODY_ZONE_HEAD)
+ jill.deal_damage(9999, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
jill.death() //just in case, for some reason, they're still alive
flash_color(jill, flash_color = "#FF0000", flash_time = 100)
diff --git a/code/game/objects/items/fixerskills/fishing/level2.dm b/code/game/objects/items/fixerskills/fishing/level2.dm
index 562768e08daf..c4a1312d608e 100644
--- a/code/game/objects/items/fixerskills/fishing/level2.dm
+++ b/code/game/objects/items/fixerskills/fishing/level2.dm
@@ -20,7 +20,7 @@
if(sinner.god_aligned == FISHGOD_NONE) //Deal a fuckload of damage to athiests
damage *= 2
- sinner.deal_damage(damage, WHITE_DAMAGE) //KILL
+ sinner.deal_damage(damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL)) //KILL
if(ishuman(user))
to_chat(sinner, span_userdanger("[user.god_aligned] has punished you for your sins using [user] as a conduit!"))
else
@@ -104,7 +104,7 @@
obliterate(victim) // their planet is dead, and so will they be
/datum/action/cooldown/fishing/chakra/proc/smite(mob/living/carbon/asshole, mob/living/carbon/user)
- asshole.apply_damage(user.devotion * SSfishing.moonphase * 0.5, WHITE_DAMAGE, null, asshole.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE) //KILL
+ asshole.deal_damage(user.devotion * SSfishing.moonphase * 0.5, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL)) //KILL
if(ishuman(asshole))
to_chat(asshole, span_userdanger("You feel your chakra rend itself!"), confidential = TRUE)
diff --git a/code/game/objects/items/food/cake.dm b/code/game/objects/items/food/cake.dm
index 3f066312acb7..5a157d964bc7 100644
--- a/code/game/objects/items/food/cake.dm
+++ b/code/game/objects/items/food/cake.dm
@@ -202,7 +202,7 @@
/obj/item/food/cake/birthday/energy/proc/energy_bite(mob/living/user)
to_chat(user, "As you eat the cake, you accidentally hurt yourself on the embedded energy sword!")
- user.apply_damage(30,BRUTE,BODY_ZONE_HEAD)
+ user.deal_damage(30, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
/obj/item/food/cake/birthday/energy/attack(mob/living/M, mob/living/user)
@@ -226,7 +226,7 @@
/obj/item/food/cakeslice/birthday/energy/proc/energy_bite(mob/living/user)
to_chat(user, "As you eat the cake slice, you accidentally hurt yourself on the embedded energy dagger!")
- user.apply_damage(18,BRUTE,BODY_ZONE_HEAD)
+ user.deal_damage(18, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
playsound(user, 'sound/weapons/blade1.ogg', 5, TRUE)
/obj/item/food/cakeslice/birthday/energy/attack(mob/living/M, mob/living/user)
diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm
index 343fc7ce3458..9789ae2e6b22 100644
--- a/code/game/objects/items/grenades/flashbang.dm
+++ b/code/game/objects/items/grenades/flashbang.dm
@@ -94,7 +94,7 @@
M.Paralyze(20)
M.Knockdown(200)
M.soundbang_act(1, 200, 10, 15)
- if(M.apply_damages(10, 10))
+ if(M.deal_multiple_damages(brute = 10, burn = 10))
to_chat(M, span_userdanger("The blast from \the [src] bruises and burns you!"))
// only checking if they're on top of the tile, cause being one tile over will be its own punishment
diff --git a/code/game/objects/items/grenades/r_corp.dm b/code/game/objects/items/grenades/r_corp.dm
index 9200e6b664e8..2cc20cb79875 100644
--- a/code/game/objects/items/grenades/r_corp.dm
+++ b/code/game/objects/items/grenades/r_corp.dm
@@ -21,9 +21,9 @@
new /obj/effect/temp_visual/explosion(get_turf(src))
playsound(loc, 'sound/effects/ordeals/steel/gcorp_boom.ogg', 75, TRUE)
for(var/mob/living/simple_animal/H in view(explosion_range, src))
- H.apply_damage(explosion_damage, explosion_damage_type, null, H.run_armor_check(null, RED_DAMAGE))
+ H.deal_damage(explosion_damage, explosion_damage_type, aThrower, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/mob/living/carbon/C in view(explosion_range, src))
- C.apply_damage(C == aThrower ? explosion_damage * 0.5 : explosion_damage * carbon_damagemod, explosion_damage_type, null, C.run_armor_check(null, RED_DAMAGE))
+ C.deal_damage(C == aThrower ? explosion_damage * 0.5 : explosion_damage * carbon_damagemod, explosion_damage_type, aThrower, attack_type = (ATTACK_TYPE_SPECIAL))
qdel(src)
/obj/item/grenade/r_corp/white
diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm
index d02c645d26e7..6f918c547664 100644
--- a/code/game/objects/items/hand_items.dm
+++ b/code/game/objects/items/hand_items.dm
@@ -63,7 +63,7 @@
span_hear("You hear a dull thud!"))
log_combat(owner, owner, "bopped", src.name, "(self)")
owner.do_attack_animation(owner)
- owner.apply_damage(100, STAMINA)
+ owner.deal_damage(100, STAMINA, flags = (DAMAGE_FORCED))
owner.Knockdown(10)
qdel(src)
@@ -94,7 +94,7 @@
owner.visible_message(span_danger("[owner] bops [sucker] with [owner.p_their()] [src.name] much harder than intended, sending [sucker.p_them()] flying!"), \
span_danger("You bop [sucker] with your [src.name] much harder than intended, sending [sucker.p_them()] flying!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), ignored_mobs=list(sucker))
to_chat(sucker, span_userdanger("[owner] bops you incredibly hard with [owner.p_their()] [src.name], sending you flying!"))
- sucker.apply_damage(50, STAMINA)
+ sucker.deal_damage(50, STAMINA, source = owner)
sucker.Knockdown(50)
log_combat(owner, sucker, "bopped", src.name, "(setup- Hulk)")
var/atom/throw_target = get_edge_target_turf(sucker, owner.dir)
@@ -102,7 +102,7 @@
else
owner.visible_message(span_danger("[owner] bops [sucker] with [owner.p_their()] [src.name]!"), span_danger("You bop [sucker] with your [src.name]!"), \
span_hear("You hear a dull thud!"), ignored_mobs=list(sucker))
- sucker.apply_damage(15, STAMINA)
+ sucker.deal_damage(15, STAMINA, source = owner)
log_combat(owner, sucker, "bopped", src.name, "(setup)")
to_chat(sucker, span_userdanger("[owner] bops you with [owner.p_their()] [src.name]!"))
qdel(src)
@@ -190,7 +190,7 @@
target.emote("scream")
log_combat(user, target, "given a noogie to", addition = "([damage] brute before armor)")
- target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
+ target.deal_damage(damage, BRUTE, source = user, attack_type = (ATTACK_TYPE_OTHER), def_zone = BODY_ZONE_HEAD)
user.adjustStaminaLoss(iteration + 5)
playsound(get_turf(user), pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg'), 50)
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index 809579230095..9a5ed327e85a 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -284,7 +284,7 @@
close_trap()
L.visible_message("[L] triggers \the [src].", \
"You trigger \the [src]!")
- L.apply_damage(trap_damage, BRUTE, def_zone)
+ L.deal_damage(trap_damage, BRUTE, flags = (DAMAGE_FORCED), def_zone = def_zone)
..()
/obj/item/restraints/legcuffs/beartrap/energy
diff --git a/code/game/objects/items/implants/implant_storage.dm b/code/game/objects/items/implants/implant_storage.dm
index c0f1a7af7540..13869b84ffb9 100644
--- a/code/game/objects/items/implants/implant_storage.dm
+++ b/code/game/objects/items/implants/implant_storage.dm
@@ -17,7 +17,7 @@
I.add_mob_blood(implantee)
lostimplant.do_quick_empty()
implantee.visible_message(span_warning("A bluespace pocket opens around [src] as it exits [implantee], spewing out its contents and rupturing the surrounding tissue!"))
- implantee.apply_damage(20, BRUTE, BODY_ZONE_CHEST)
+ implantee.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_CHEST)
qdel(lostimplant)
return ..()
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 6073076e0383..fb57e019bf12 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -409,7 +409,7 @@
if(!target_limb) // Does this limb exist at all?
return
var/armor_v = H.getarmor(target_limb, type = "melee")
- H.apply_damage(force, STAMINA, selected_bodypart_area, armor_v) // Regardless of limb, you get some stamina damage
+ H.deal_damage(force, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = selected_bodypart_area, blocked = armor_v) // Regardless of limb, you get some stamina damage
switch(selected_bodypart_area)
if(BODY_ZONE_L_ARM)
if(armor_v < 41)
@@ -426,7 +426,7 @@
if(!H.is_eyes_covered() && eyes) // You have eyes, right..?
to_chat(H, "[user] managed to hit your eyes with [src]!")
to_chat(user, "You managed to hit [H] with [src] right in the eyes!")
- H.apply_damage(force*2, STAMINA, selected_bodypart_area, armor_v) // That's ADDITIONAL damage.
+ H.deal_damage(force*2, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = selected_bodypart_area, blocked = armor_v) // That's ADDITIONAL damage.
H.emote("scream")
H.blur_eyes(3)
H.add_confusion(2)
@@ -434,7 +434,7 @@
else
if((armor_v < 16) && prob(15 - armor_v)) // Armor is too low! That's gonna sting.
to_chat(H, "You can't stand this pain!")
- H.apply_damage(force*2, STAMINA, selected_bodypart_area, armor_v) // Even more damage.
+ H.deal_damage(force*2, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = selected_bodypart_area, blocked = armor_v) // Even more damage.
H.emote("scream")
H.Stun(2)
H.Jitter(3)
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index 9e13107c30c4..f5f3881b2014 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -85,7 +85,7 @@
T.air_update_turf(FALSE, FALSE)
if(!gasused)
to_chat(user, span_warning("\The [src]'s tank is empty!"))
- target.apply_damage((force / 5), BRUTE)
+ target.deal_damage((force / 5), BRUTE, user, attack_type = (ATTACK_TYPE_MELEE))
playsound(loc, 'sound/weapons/punch1.ogg', 50, TRUE)
target.visible_message(span_danger("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!"), \
span_userdanger("[user]'s punches you!"))
@@ -93,12 +93,12 @@
if(gasused.total_moles() < gasperfist * fisto_setting)
to_chat(user, span_warning("\The [src]'s piston-ram lets out a weak hiss, it needs more gas!"))
playsound(loc, 'sound/weapons/punch4.ogg', 50, TRUE)
- target.apply_damage((force / 2), BRUTE)
+ target.deal_damage((force / 2), BRUTE, user, attack_type = (ATTACK_TYPE_MELEE))
target.visible_message(span_danger("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!"), \
span_userdanger("[user]'s punch strikes with force!"))
return
- target.apply_damage(force * fisto_setting, BRUTE, wound_bonus = CANT_WOUND)
+ target.deal_damage(force * fisto_setting, BRUTE, user, attack_type = (ATTACK_TYPE_MELEE))
target.visible_message(span_danger("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!"), \
span_userdanger("You cry out in pain as [user]'s punch flings you backwards!"))
new /obj/effect/temp_visual/kinetic_blast(target.loc)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 8baaf7a11925..e97cbafd1707 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -321,7 +321,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
var/mob/living/carbon/human/H = user
if(!H.gloves && !HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) // golems, etc
to_chat(H, "[src] cuts into your hand!")
- H.apply_damage(force*0.5, BRUTE, hit_hand)
+ H.deal_damage(force*0.5, BRUTE, flags = (DAMAGE_FORCED), def_zone = hit_hand)
/obj/item/shard/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/lightreplacer))
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 508a1f12d59c..0729bdd756a0 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -408,7 +408,7 @@
return
///no food found: it bites you and loses some hp
var/affecting = user.get_bodypart(BODY_ZONE_CHEST)
- user.apply_damage(60, BRUTE, affecting)
+ user.deal_damage(60, BRUTE, flags = (DAMAGE_FORCED), def_zone = affecting)
hunger = initial(hunger)
playsound(src, 'sound/items/eatfood.ogg', 20, TRUE)
to_chat(user, "The [name] eats your back!")
diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm
index 04fb63d6720b..9098ea278421 100644
--- a/code/game/objects/items/storage/book.dm
+++ b/code/game/objects/items/storage/book.dm
@@ -287,7 +287,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning",
uses -= 1
to_chat(H, span_userdanger("You try to open the book AND IT BITES YOU!"))
playsound(src.loc, 'sound/effects/snap.ogg', 50, TRUE)
- H.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ H.deal_damage(5, BRUTE, flags = (DAMAGE_FORCED), def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
to_chat(H, span_notice("Your name appears on the inside cover, in blood."))
var/ownername = H.real_name
desc += span_warning("The name [ownername] is written in blood inside the cover.")
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index ddf4d9e1e2fd..2a12997b1d80 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -237,7 +237,7 @@
L.Jitter(20)
L.set_confusion(max(confusion_amt, L.get_confusion()))
L.stuttering = max(8, L.stuttering)
- L.apply_damage(stamina_loss_amt, STAMINA, BODY_ZONE_CHEST, armor_v)
+ L.deal_damage(stamina_loss_amt, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST, blocked = armor_v)
SEND_SIGNAL(L, COMSIG_LIVING_MINOR_SHOCK)
addtimer(CALLBACK(src, PROC_REF(apply_stun_effect_end), L, armor_v), apply_stun_delay)
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index 15b0e3814723..742cf9eef6e6 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -151,7 +151,7 @@
addtimer(CALLBACK(C, TYPE_PROC_REF(/mob, emote), "clap"), delay_offset * 0.3)
delay_offset++
else
- H.apply_damage(15 * blade_sharpness, BRUTE, head)
+ H.deal_damage(15 * blade_sharpness, BRUTE, flags = (DAMAGE_FORCED), def_zone = head)
log_combat(user, H, "dropped the blade on", src, " non-fatally")
H.emote("scream")
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index ee80a52b6cc3..523d06f95ce3 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -134,8 +134,8 @@
if(pushed_mob.loc != loc) //Something prevented the tabling
return
pushed_mob.Knockdown(30)
- pushed_mob.apply_damage(10, BRUTE)
- pushed_mob.apply_damage(40, STAMINA)
+ pushed_mob.deal_damage(10, BRUTE, source = user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER))
+ pushed_mob.deal_damage(40, STAMINA, source = user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER))
if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user))
deconstruct(FALSE)
playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE)
@@ -150,7 +150,7 @@
if(HAS_TRAIT(user, TRAIT_HULK))
extra_wound = 20
banged_limb?.receive_damage(30, wound_bonus = extra_wound)
- pushed_mob.apply_damage(60, STAMINA)
+ pushed_mob.deal_damage(60, STAMINA, source = user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER))
take_damage(50)
if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user))
deconstruct(FALSE)
diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm
index 8d62fe00f5c3..338b80703a18 100644
--- a/code/game/objects/structures/training_machine.dm
+++ b/code/game/objects/structures/training_machine.dm
@@ -283,7 +283,7 @@
return
do_attack_animation(target, null, attached_item)
if (obj_flags & EMAGGED)
- target.apply_damage(attached_item.force, BRUTE, BODY_ZONE_CHEST)
+ target.deal_damage(attached_item.force, attached_item.damtype, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST)
playsound(src, 'sound/weapons/smash.ogg', 15, TRUE)
COOLDOWN_START(src, attack_cooldown, rand(MIN_ATTACK_DELAY, MAX_ATTACK_DELAY))
diff --git a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm
index 8d955a4420a6..24d49a12d288 100644
--- a/code/modules/antagonists/blob/blobstrains/blazing_oil.dm
+++ b/code/modules/antagonists/blob/blobstrains/blazing_oil.dm
@@ -38,6 +38,6 @@
exposed_mob.adjust_fire_stacks(round(reac_volume/10))
exposed_mob.IgniteMob()
if(exposed_mob)
- exposed_mob.apply_damage(0.8*reac_volume, FIRE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.8*reac_volume, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), wound_bonus = CANT_WOUND)
if(iscarbon(exposed_mob))
exposed_mob.emote("scream")
diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm
index 0b850d0c7439..431e78abe3c2 100644
--- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm
+++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm
@@ -23,7 +23,7 @@
exposed_mob.reagents.add_reagent(/datum/reagent/consumable/frostoil, 0.3*reac_volume)
exposed_mob.reagents.add_reagent(/datum/reagent/consumable/ice, 0.3*reac_volume)
exposed_mob.reagents.add_reagent(/datum/reagent/blob/cryogenic_poison, 0.3*reac_volume)
- exposed_mob.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.2*reac_volume, BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER), wound_bonus = CANT_WOUND)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/exposed_mob)
exposed_mob.adjustBruteLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
diff --git a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm
index 25a6b3ef521c..6b70fab27236 100644
--- a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm
+++ b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm
@@ -27,7 +27,7 @@
/datum/reagent/blob/distributed_neurons/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind)
. = ..()
reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind)
- exposed_mob.apply_damage(0.6*reac_volume, TOX)
+ exposed_mob.deal_damage(0.6*reac_volume, TOX, flags = (DAMAGE_FORCED))
if(overmind && ishuman(exposed_mob))
if(exposed_mob.stat == UNCONSCIOUS || exposed_mob.stat == HARD_CRIT)
exposed_mob.death() //sleeping in a fight? bad plan.
diff --git a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm
index 798239fd6b82..6baa40d05389 100644
--- a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm
+++ b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm
@@ -29,4 +29,4 @@
if(prob(reac_volume*2))
exposed_mob.emp_act(EMP_LIGHT)
if(exposed_mob)
- exposed_mob.apply_damage(reac_volume, FIRE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(reac_volume, FIRE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
index 9151df66a7ce..175695c72c76 100644
--- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
+++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm
@@ -32,4 +32,4 @@
exposed_mob.losebreath += round(0.2*reac_volume)
exposed_mob.adjustStaminaLoss(reac_volume * 1.2)
if(exposed_mob)
- exposed_mob.apply_damage(0.6*reac_volume, OXY)
+ exposed_mob.deal_damage(0.6*reac_volume, OXY, flags = (DAMAGE_FORCED))
diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
index a7dd6a9883d6..79d5cc3da1c6 100644
--- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
+++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
@@ -24,7 +24,7 @@
for(var/mob/living/actor in orange(get_turf(spore), 1))
if(ROLE_BLOB in actor.faction) //no friendly fire
continue
- actor.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND)
+ actor.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
/datum/reagent/blob/explosive_lattice
name = "Explosive Lattice"
@@ -47,8 +47,8 @@
show_message = FALSE
touch_protection = nearby_mob.get_permeability_protection()
var/aoe_volume = ..()
- nearby_mob.apply_damage(0.4*aoe_volume, BRUTE, wound_bonus=CANT_WOUND)
+ nearby_mob.deal_damage(0.4*aoe_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
if(exposed_mob)
- exposed_mob.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.6*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
else
- exposed_mob.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.6*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm
index 491dcd9bf0a8..2ad7ff0f9f8a 100644
--- a/code/modules/antagonists/blob/blobstrains/networked_fibers.dm
+++ b/code/modules/antagonists/blob/blobstrains/networked_fibers.dm
@@ -36,6 +36,6 @@
/datum/reagent/blob/networked_fibers/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind)
. = ..()
reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind)
- exposed_mob.apply_damage(0.6*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.6*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
if(!QDELETED(exposed_mob))
- exposed_mob.apply_damage(0.6*reac_volume, FIRE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.6*reac_volume, FIRE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
index 85cf745d29da..829f55a7cba1 100644
--- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
+++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm
@@ -46,7 +46,7 @@
if(istype(location_turf) && prob(reac_volume))
location_turf.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
exposed_mob.adjust_fire_stacks(-(reac_volume / 10))
- exposed_mob.apply_damage(0.4*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.4*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
if(exposed_mob)
exposed_mob.adjustStaminaLoss(reac_volume, FALSE)
- exposed_mob.apply_damage(0.4 * reac_volume, OXY)
+ exposed_mob.deal_damage(0.4*reac_volume, OXY, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm
index b2bbbdc734cf..cf5a49dd7a53 100644
--- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm
+++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm
@@ -22,7 +22,7 @@
if(exposed_mob.reagents)
exposed_mob.reagents.add_reagent(/datum/reagent/blob/regenerative_materia, 0.2*reac_volume)
exposed_mob.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume)
- exposed_mob.apply_damage(0.7*reac_volume, TOX)
+ exposed_mob.deal_damage(0.7*reac_volume, TOX, flags = (DAMAGE_FORCED))
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/C)
C.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
diff --git a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm
index e9d1f40805de..36de992752d5 100644
--- a/code/modules/antagonists/blob/blobstrains/replicating_foam.dm
+++ b/code/modules/antagonists/blob/blobstrains/replicating_foam.dm
@@ -33,4 +33,4 @@
/datum/reagent/blob/replicating_foam/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind)
. = ..()
reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind)
- exposed_mob.apply_damage(0.7*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.7*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
index 670ca9a2ebb3..7e4d0cc7ad34 100644
--- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
+++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm
@@ -34,4 +34,4 @@
/datum/reagent/blob/shifting_fragments/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind)
. = ..()
reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind)
- exposed_mob.apply_damage(0.7*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.7*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm
index bd5954f1600b..6290ea3f9f3d 100644
--- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm
+++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm
@@ -32,9 +32,9 @@
/datum/reagent/blob/synchronous_mesh/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind)
. = ..()
reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind)
- exposed_mob.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.2*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
if(exposed_mob && reac_volume)
for(var/obj/structure/blob/nearby_blob in range(1, exposed_mob)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume
if(exposed_mob)
nearby_blob.blob_attack_animation(exposed_mob) //show them they're getting a bad time
- exposed_mob.apply_damage(0.3*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
+ exposed_mob.deal_damage(0.3*reac_volume, BRUTE, flags = (DAMAGE_FORCED), wound_bonus=CANT_WOUND)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index b4d0f5f69b47..1a80cf881062 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -331,7 +331,7 @@
for(var/obj/item/I in H.held_items)
if(I.get_sharpness())
C.visible_message("[H] impales [C] with [H.p_their()] [I.name]!", "[H] impales you with [H.p_their()] [I.name]!")
- C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST)
+ C.deal_damage(I.force, I.damtype, source = H, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST)
H.do_item_attack_animation(C, used_item = I)
H.add_mob_blood(C)
playsound(get_turf(H),I.hitsound,75,TRUE)
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
index 46ed4d433095..7c480e5408bb 100644
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ b/code/modules/antagonists/cult/blood_magic.dm
@@ -395,9 +395,9 @@
user.whisper(invocation, language = /datum/language/common)
if(health_cost)
if(user.active_hand_index == 1)
- user.apply_damage(health_cost, BRUTE, BODY_ZONE_L_ARM)
+ user.deal_damage(health_cost, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_L_ARM)
else
- user.apply_damage(health_cost, BRUTE, BODY_ZONE_R_ARM)
+ user.deal_damage(health_cost, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_R_ARM)
if(uses <= 0)
qdel(src)
else if(source)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 7a1da58edef3..df68045e4ae1 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -61,7 +61,7 @@
"\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")
if(ishuman(user))
var/mob/living/carbon/human/H = user
- H.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ H.deal_damage(rand(force/2, force), BRUTE, flags = (DAMAGE_FORCED), def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
else
user.adjustBruteLoss(rand(force/2,force))
return
@@ -767,9 +767,9 @@
if(iscarbon(user))
var/mob/living/carbon/C = user
if(C.active_hand_index == 1)
- C.apply_damage(20, BRUTE, BODY_ZONE_L_ARM, wound_bonus = 20, sharpness = SHARP_EDGED) //oof ouch
+ C.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_L_ARM, wound_bonus = 20, sharpness = SHARP_EDGED) //oof ouch
else
- C.apply_damage(20, BRUTE, BODY_ZONE_R_ARM, wound_bonus = 20, sharpness = SHARP_EDGED)
+ C.deal_damage(20, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_R_ARM, wound_bonus = 20, sharpness = SHARP_EDGED)
qdel(src)
return FALSE
diff --git a/code/modules/antagonists/cult/ritual.dm b/code/modules/antagonists/cult/ritual.dm
index 57827d069418..4b8420e4b156 100644
--- a/code/modules/antagonists/cult/ritual.dm
+++ b/code/modules/antagonists/cult/ritual.dm
@@ -127,7 +127,7 @@ This file contains the cult dagger and rune list code
user.visible_message("[user] [user.blood_volume ? "cuts open [user.p_their()] arm and begins writing in [user.p_their()] own blood":"begins sketching out a strange design"]!", \
"You [user.blood_volume ? "slice open your arm and ":""]begin drawing a sigil of the Geometer.")
if(user.blood_volume)
- user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days?
+ user.deal_damage(initial(rune_to_scribe.scribe_damage), BRUTE, flags = (DAMAGE_FORCED), def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days?
var/scribe_mod = initial(rune_to_scribe.scribe_delay)
if(istype(get_turf(user), /turf/open/floor/engine/cult) && !(ispath(rune_to_scribe, /obj/effect/rune/narsie)))
scribe_mod *= 0.5
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index b1691ceb3eca..71fe13fdc0c2 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -153,7 +153,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(invocation)
L.say(invocation, language = /datum/language/common, ignore_spam = TRUE, forced = "cult invocation")
if(invoke_damage)
- L.apply_damage(invoke_damage, BRUTE)
+ L.deal_damage(invoke_damage, BRUTE, flags = (DAMAGE_FORCED))
to_chat(L, "[src] saps your strength!")
else if(istype(M, /obj/item/toy/plush/narplush))
var/obj/item/toy/plush/narplush/P = M
@@ -633,7 +633,7 @@ structure_check() searches for nearby cultist structures required for the invoca
barrier.Toggle()
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.apply_damage(2, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
+ C.deal_damage(2, BRUTE, flags = (DAMAGE_FORCED), def_zone = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
//Rite of Joined Souls: Summons a single cultist.
/obj/effect/rune/summon
@@ -819,7 +819,7 @@ structure_check() searches for nearby cultist structures required for the invoca
while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T))
if(user.stat != CONSCIOUS || HAS_TRAIT(new_human, TRAIT_CRITICAL_CONDITION))
break
- user.apply_damage(0.1, BRUTE)
+ user.deal_damage(0.1, BRUTE, flags = (DAMAGE_FORCED))
sleep(1)
qdel(N)
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_structures.dm b/code/modules/antagonists/eldritch_cult/eldritch_structures.dm
index 164491aef9d9..b7ab9aebe3e2 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_structures.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_structures.dm
@@ -154,8 +154,8 @@
return
var/mob/living/carbon/carbon_victim = L
carbon_victim.Paralyze(5 SECONDS)
- carbon_victim.apply_damage(20,BRUTE,BODY_ZONE_R_LEG)
- carbon_victim.apply_damage(20,BRUTE,BODY_ZONE_L_LEG)
+ carbon_victim.deal_damage(20,BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_R_LEG)
+ carbon_victim.deal_damage(20,BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_L_LEG)
playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
return ..()
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index e6e4ed22d8f0..1f5a3fea3bdd 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -65,7 +65,7 @@
else if(israt(target))
var/mob/living/simple_animal/hostile/rat/ratt = target
visible_message("Clink!")
- ratt.apply_damage(5) //Not lethal, but just enought to make a mark.
+ ratt.deal_damage(5, attack_type = (ATTACK_TYPE_ENVIRONMENT)) //Not lethal, but just enought to make a mark.
ratt.Stun(1 SECONDS)
else if(isregalrat(target))
visible_message("Skreeeee!") //He's simply too large to be affected by a tiny mouse trap.
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
index 0c5d48e32a35..5169bbc35e1b 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm
@@ -77,4 +77,4 @@
if(pipe_air.temperature > heat_limit + 1)
for(var/m in buckled_mobs)
var/mob/living/buckled_mob = m
- buckled_mob.apply_damage(delta_time * 2 * log(pipe_air.temperature - heat_limit), FIRE, BODY_ZONE_CHEST)
+ buckled_mob.deal_damage(delta_time * 2 * log(pipe_air.temperature - heat_limit), FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT), def_zone = BODY_ZONE_CHEST)
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 06519ce228a5..4f1c477cc860 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -418,7 +418,7 @@
if(!ismonkey(user) || user.ckey)
var/mob/living/something = user
to_chat(something, "You feel a stabbing pain in the back of your head for a moment.")
- something.apply_damage(5,BRUTE,BODY_ZONE_HEAD,FALSE,FALSE,FALSE) //notably: no damage resist (it's in your helmet), no damage spread (it's in your helmet)
+ something.deal_damage(5,BRUTE, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = BODY_ZONE_HEAD) //notably: no damage resist (it's in your helmet), no damage spread (it's in your helmet)
playsound(src, 'sound/machines/buzz-sigh.ogg', 30, TRUE)
return
if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE))
@@ -460,7 +460,7 @@
if(1) //blood rage
magnification.ai_controller.blackboard[BB_MONKEY_AGRESSIVE] = TRUE
if(2) //brain death
- magnification.apply_damage(500,BRAIN,BODY_ZONE_HEAD,FALSE,FALSE,FALSE)
+ magnification.deal_damage(500,BRAIN, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = BODY_ZONE_HEAD)
if(3) //primal gene (gorilla)
magnification.gorillize()
if(4) //genetic mass susceptibility (gib)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 74a15f226b59..c7b034681851 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -434,7 +434,7 @@
occupant.forceMove(user.drop_location())
user.visible_message("[user] recoils as something slithers out of [src].", "You feel a sudden stabbing pain in your [pick("foot", "toe", "ankle")]!")
user.Knockdown(20) //Is one second paralyze better here? I feel you would fall on your ass in some fashion.
- user.apply_damage(5, BRUTE, pick(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
+ user.deal_damage(5, BRUTE, flags = (DAMAGE_FORCED), def_zone = pick(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
if(istype(occupant, /mob/living/simple_animal/hostile/retaliate/poison))
user.reagents.add_reagent(/datum/reagent/toxin, 7)
occupants.Cut()
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index e77dbbfb98d9..6b83d4a514ce 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -195,7 +195,7 @@
. = ..()
var/mob/living/carbon/human/user = src.loc
if(istype(user))
- user.apply_damage(HARDSUIT_EMP_BURN, FIRE, spread_damage=TRUE)
+ user.deal_damage(HARDSUIT_EMP_BURN, FIRE, flags = (DAMAGE_FORCED))
to_chat(user, "You feel \the [src] heat up from the EMP burning you slightly.")
// Chance to scream
diff --git a/code/modules/clothing/suits/ego_gear/realized.dm b/code/modules/clothing/suits/ego_gear/realized.dm
index 6a3fe9c2810f..f4a898b5cb1e 100644
--- a/code/modules/clothing/suits/ego_gear/realized.dm
+++ b/code/modules/clothing/suits/ego_gear/realized.dm
@@ -468,12 +468,14 @@ No Ability 260
/obj/item/clothing/suit/armor/ego_gear/realization/fallencolors/proc/Reset()
canSUCC = TRUE
-/obj/item/clothing/suit/armor/ego_gear/realization/fallencolors/proc/OnDamaged(mob/living/carbon/human/user)
+/obj/item/clothing/suit/armor/ego_gear/realization/fallencolors/proc/OnDamaged(mob/living/carbon/human/user, damage_amount, damage_type, def_zone, attacker, damage_flags, attack_type)
//goonchem_vortex(get_turf(src), 1, 3)
if(!canSUCC)
return
if(user.is_working)
return
+ if(damage_amount <= 0 || !isliving(attacker) || user == attacker || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
+ return
canSUCC = FALSE
addtimer(CALLBACK(src, PROC_REF(Reset)), 2 SECONDS)
for(var/turf/T in view(3, user))
@@ -485,7 +487,7 @@ No Ability 260
continue
var/atom/throw_target = get_edge_target_turf(L, get_dir(L, get_step_away(L, get_turf(src))))
L.throw_at(throw_target, 1, 1)
- L.apply_damage(5, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(20, WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL| ATTACK_TYPE_COUNTER))
/* Effloresced (Personal) E.G.O */
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index 555722b53e33..352e0b62199f 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -260,7 +260,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
user.visible_message("[src] transforms into [wizard] as [user] suplexes them!", "As you grab [src], it suddenly turns into [wizard] as you suplex them!")
to_chat(wizard, "You're suddenly jolted out of rod-form as [user] somehow manages to grab you, slamming you into the ground!")
wizard.Stun(60)
- wizard.apply_damage(25, BRUTE)
+ wizard.deal_damage(25, BRUTE, source = user, flags = (DAMAGE_FORCED))
qdel(src)
else
user.client.give_award(/datum/award/achievement/misc/feat_of_strength, user) //rod-form wizards would probably make this a lot easier to get so keep it to regular rods only
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index c646d1ddd9d4..6bf49a33d292 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -165,7 +165,7 @@
var/armor = C.run_armor_check(limb, MELEE, null, null) //armor = the armor value of that randomly chosen bodypart. Nulls to not print a message, because it would still print on pierce.
var/datum/spacevine_mutation/thorns/T = locate() in S.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it.
if(T && (prob(40))) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed.
- C.apply_damage(50, BRUTE, def_zone = limb, wound_bonus = rand(-20,10), sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor.
+ C.deal_damage(50, BRUTE, attack_type = (ATTACK_TYPE_ENVIRONMENT), def_zone = limb, wound_bonus = rand(-20,10), sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor.
C.Stun(1 SECONDS) //Stopped in place for a moment.
playsound(M, 'sound/weapons/pierce.ogg', 50, TRUE, -1)
M.visible_message("[M] is nailed by a sharp thorn!", \
@@ -173,14 +173,14 @@
log_combat(S, M, "aggressively pierced") //"Aggressively" for easy ctrl+F'ing in the attack logs.
else
if(prob(80))
- C.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED)
+ C.deal_damage(60, BRUTE, attack_type = (ATTACK_TYPE_ENVIRONMENT), def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_EDGED)
C.Knockdown(2 SECONDS)
playsound(M, 'sound/weapons/whip.ogg', 50, TRUE, -1)
M.visible_message("[M] is lacerated by an outburst of vines!", \
"You are lacerated by an outburst of vines!")
log_combat(S, M, "aggressively lacerated")
else
- C.apply_damage(60, BRUTE, def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_NONE)
+ C.deal_damage(60, BRUTE, attack_type = (ATTACK_TYPE_ENVIRONMENT), def_zone = limb, blocked = armor, wound_bonus = rand(-20,10), sharpness = SHARP_NONE)
C.Knockdown(3 SECONDS)
var/atom/throw_target = get_edge_target_turf(C, get_dir(S, get_step_away(C, S)))
C.throw_at(throw_target, 3, 6)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index fea2e988f9bc..f8a17e8bcb48 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -1415,7 +1415,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
target.playsound_local(get_turf(src), 'sound/weapons/slash.ogg', 60, 0, 3)
to_chat(target, "[src] [damage_text] you!")
if(damage)
- target.apply_damage(damage, WHITE_DAMAGE, null, target.run_armor_check(null, WHITE_DAMAGE))
+ target.deal_damage(damage, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
new /datum/hallucination/hudscrew(target, TRUE, SCREWYHUD_CRIT)
qdel(src)
@@ -1440,7 +1440,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
/obj/effect/hallucination/danger/misc/Crossed(atom/movable/AM)
. = ..()
if(AM == target && damage)
- target.apply_damage(damage, WHITE_DAMAGE, null, target.run_armor_check(null, WHITE_DAMAGE))
+ target.deal_damage(damage, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
/datum/hallucination/death
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 0ec31520452c..2f27f1d951da 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -104,7 +104,7 @@
//Apply the damage!
armor_block = min(90,armor_block)
- target.apply_damage(force, BRUTE, affecting, armor_block)
+ target.deal_damage(force, BRUTE, user, attack_type = (ATTACK_TYPE_MELEE))
// You are going to knock someone down for longer if they are not wearing a helmet.
var/head_attack_message = ""
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 40b4d9b3f7ff..ed6039b7db09 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( //Blacklisted for s
user.visible_message(span_danger("[user] dunks [C]'s face in [src]!"))
reagents.expose(C, TOUCH)
var/permeability = 1 - C.get_permeability_protection(list(HEAD))
- C.apply_damage(min(30 * permeability, reagents.total_volume), FIRE, BODY_ZONE_HEAD)
+ C.deal_damage(min(30 * permeability, reagents.total_volume), FIRE, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = BODY_ZONE_HEAD)
reagents.remove_any((reagents.total_volume/2))
C.Paralyze(60)
user.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 250cd058f745..9b5ed965f406 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -86,7 +86,7 @@
if((ishuman(hit_atom)))
var/mob/living/carbon/M = hit_atom
playsound(src, 'sound/items/dodgeball.ogg', 50, TRUE)
- M.apply_damage(10, STAMINA)
+ M.deal_damage(10, STAMINA, source = throwingdatum.thrower, attack_type = (ATTACK_TYPE_THROWING))
if(prob(5))
M.Paralyze(60)
visible_message("[M] is knocked right off [M.p_their()] feet!")
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index b1cfc04ad4ea..1bef8629f658 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -136,12 +136,12 @@
if((user.dir & backstab_dir) && (L.dir & backstab_dir))
if(!QDELETED(C))
C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item
- L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check)
+ L.deal_damage(detonation_damage + backstab_bonus, BRUTE, source = user, attack_type = (ATTACK_TYPE_MELEE), blocked = def_check)
playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong
else
if(!QDELETED(C))
C.total_damage += detonation_damage
- L.apply_damage(detonation_damage, BRUTE, blocked = def_check)
+ L.deal_damage(detonation_damage, BRUTE, source = user, attack_type = (ATTACK_TYPE_MELEE), blocked = def_check)
/obj/item/kinetic_crusher/proc/Recharge()
if(!charged)
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index f605b50421ca..2ea84c5293dd 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -109,7 +109,7 @@
if(creator)
log_combat(creator, L, "used a resonator field on", "resonator")
to_chat(L, span_userdanger("[src] ruptured with you in it!"))
- L.apply_damage(resonance_damage, BRUTE)
+ L.deal_damage(resonance_damage, BRUTE, flags = (DAMAGE_FORCED))
L.add_movespeed_modifier(/datum/movespeed_modifier/resonance)
addtimer(CALLBACK(L, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/resonance), 10 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
for(var/obj/effect/temp_visual/resonance/field in range(1, src))
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index a5d6d74a3abf..cd11816bacb8 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -58,14 +58,14 @@
throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire)
switch(bodytemperature)
if(360 to 400)
- apply_damage(HEAT_DAMAGE_LEVEL_1, FIRE)
+ deal_damage(HEAT_DAMAGE_LEVEL_1, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(400 to 460)
- apply_damage(HEAT_DAMAGE_LEVEL_2, FIRE)
+ deal_damage(HEAT_DAMAGE_LEVEL_2, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(460 to INFINITY)
if(on_fire)
- apply_damage(HEAT_DAMAGE_LEVEL_3, FIRE)
+ deal_damage(HEAT_DAMAGE_LEVEL_3, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
else
- apply_damage(HEAT_DAMAGE_LEVEL_2, FIRE)
+ deal_damage(HEAT_DAMAGE_LEVEL_2, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
else
clear_alert("alien_fire")
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 7dab3f3049dd..a7e87c13ccc2 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -76,7 +76,7 @@ In all, this is a lot like the monkey code. /N
if(..())
if (stat != DEAD)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- apply_damage(rand(1, 3), BRUTE, affecting)
+ deal_damage(rand(1, 3), BRUTE, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
index 797e36b4adc1..d8475457c9a4 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm
@@ -30,7 +30,7 @@
span_userdanger("[M] knocks you down!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, M)
to_chat(M, span_danger("You knock [src] down!"))
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- apply_damage(damage, BRUTE, affecting)
+ deal_damage(damage, BRUTE, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
log_combat(M, src, "attacked")
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
index 6e9e1ea68706..09d5da29c749 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm
@@ -13,7 +13,7 @@
Unconscious(rand(100,200))
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
- apply_damage(damage, BRUTE, affecting)
+ deal_damage(damage, BRUTE, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
else
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1)
visible_message(span_danger("[M]'s kick misses [src]!"), \
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 92a5863a209f..9fbfe77246e6 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -85,7 +85,7 @@
if(istype(I, /obj/item/ego_weapon))
var/obj/item/ego_weapon/theweapon = I
damage *= theweapon.force_multiplier
- apply_damage(damage, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), white_healable = TRUE)
+ deal_damage(damage, I.damtype, source = user, flags = (DAMAGE_WHITE_HEALABLE), attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness())
if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC)
if(prob(33))
I.add_mob_blood(src)
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index 85d366e15d06..39aef92713ec 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -1,62 +1,3 @@
-
-
-/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
- var/signal_return = SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
- if(signal_return & COMPONENT_MOB_DENY_DAMAGE)
- return FALSE
-
- var/hit_percent = (100-blocked)/100
- if(!damage || (!forced && hit_percent <= 0))
- return 0
-
- var/obj/item/bodypart/BP = null
- if(!spread_damage)
- if(isbodypart(def_zone)) //we specified a bodypart object
- BP = def_zone
- else
- if(!def_zone)
- def_zone = ran_zone(def_zone)
- BP = get_bodypart(check_zone(def_zone))
- if(!BP)
- BP = bodyparts[1]
-
- var/damage_amount = forced ? damage : damage * hit_percent
- switch(damagetype)
- if(BRUTE)
- if(BP)
- if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
- update_damage_overlays()
- else //no bodypart, we deal damage with a more general method.
- adjustBruteLoss(damage_amount, forced = forced)
- if(FIRE)
- if(BP)
- if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
- update_damage_overlays()
- else
- adjustFireLoss(damage_amount, forced = forced)
- if(TOX)
- adjustToxLoss(damage_amount, forced = forced)
- if(OXY)
- adjustOxyLoss(damage_amount, forced = forced)
- if(CLONE)
- adjustCloneLoss(damage_amount, forced = forced)
- if(STAMINA)
- if(BP)
- if(BP.receive_damage(0, 0, damage_amount))
- update_damage_overlays()
- else
- adjustStaminaLoss(damage_amount, forced = forced)
- if(RED_DAMAGE)
- adjustRedLoss(damage_amount, forced = forced)
- if(WHITE_DAMAGE)
- adjustWhiteLoss(damage_amount, forced = forced, white_healable = white_healable)
- if(BLACK_DAMAGE)
- adjustBlackLoss(damage_amount, forced = forced, white_healable = white_healable)
- if(PALE_DAMAGE)
- adjustPaleLoss(damage_amount, forced = forced)
- return TRUE
-
-
//These procs fetch a cumulative total damage from all bodyparts
/mob/living/carbon/getBruteLoss()
var/amount = 0
diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm
index 2fa7286c8dbd..7cdee9340f27 100644
--- a/code/modules/mob/living/carbon/human/damage_procs.dm
+++ b/code/modules/mob/living/carbon/human/damage_procs.dm
@@ -1,6 +1,16 @@
/// depending on the species, it will run the corresponding apply_damage code there
-/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
- return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/carbon/human/deal_damage(damage_amount, damage_type, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
+ if(GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damage_type)) // Yes I have to do yet another shuffler check here because god damn it we're handling human damage in the species datum
+ var/datum/damage_type_shuffler/shuffler = GLOB.damage_type_shuffler
+ damage_type = shuffler.mapping_offense[damage_type]
+
+ if(!(flags & DAMAGE_FORCED) && (!PreDamageReaction(damage_amount, damage_type, source))) // If our forced argument isn't TRUE, then we expect to receive a TRUE from PreDamageReaction to continue the proc
+ return FALSE
+
+ . = dna.species.apply_damage(src, damage_amount, damage_type, source, flags, attack_type, blocked, def_zone, wound_bonus, bare_wound_bonus, sharpness)
+
+ PostDamageReaction(., damage_type, flags & DAMAGE_UNTRACKABLE ? null : source)
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index d7b2934f3d23..32a00b1078c5 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -207,7 +207,7 @@
visible_message(span_danger("[user] [hulk_verb]ed [src]!"), \
span_userdanger("[user] [hulk_verb]ed [src]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, user)
to_chat(user, span_danger("You [hulk_verb] [src]!"))
- apply_damage(15, BRUTE, wound_bonus=10)
+ deal_damage(15, BRUTE, source = user, attack_type = (ATTACK_TYPE_MELEE), wound_bonus=10)
/mob/living/carbon/human/attack_hand(mob/user)
if(..()) //to allow surgery to return properly.
@@ -258,7 +258,7 @@
if(check_shields(M, damage, "the [M.name]"))
return FALSE
if(stat != DEAD)
- apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE))
+ deal_damage(damage, BRUTE, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = run_armor_check(affecting, MELEE))
return TRUE
/mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M)
@@ -292,7 +292,7 @@
log_combat(M, src, "attacked")
if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful
return TRUE
- apply_damage(damage, BRUTE, affecting, armor_block)
+ deal_damage(damage, BRUTE, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = armor_block)
if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead.
var/obj/item/I = get_active_held_item()
@@ -325,7 +325,7 @@
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, MELEE)
- apply_damage(damage, BRUTE, affecting, armor_block)
+ deal_damage(damage, BRUTE, source = L, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = armor_block)
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
@@ -342,7 +342,7 @@
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor = run_armor_check(affecting, M.melee_damage_type, armour_penetration = M.armour_penetration)
- apply_damage(damage, M.melee_damage_type, affecting, armor, wound_bonus = M.wound_bonus, bare_wound_bonus = M.bare_wound_bonus, sharpness = M.sharpness, forced = FALSE)
+ deal_damage(damage, M.melee_damage_type, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = armor, wound_bonus = M.wound_bonus, bare_wound_bonus = M.bare_wound_bonus, sharpness = M.sharpness)
/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M)
@@ -368,7 +368,7 @@
if(!affecting)
affecting = get_bodypart(BODY_ZONE_CHEST)
var/armor_block = run_armor_check(affecting, M.melee_damage_type)
- apply_damage(damage, BRUTE, affecting, armor_block, wound_bonus=wound_mod)
+ deal_damage(damage, BRUTE, source = M, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = armor_block, wound_bonus=wound_mod)
/mob/living/carbon/human/ex_act(severity, target, origin)
@@ -446,7 +446,7 @@
show_message(span_userdanger("The blob attacks you!"))
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
- apply_damage(5, BRUTE, affecting, run_armor_check(affecting, MELEE))
+ deal_damage(5, BRUTE, source = B, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = run_armor_check(affecting, MELEE))
///Calculates the siemens coeff based on clothing and species, can also restart hearts.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 56bb483dd8eb..0a5055210d68 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1412,7 +1412,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
log_combat(user, target, "attempted to punch")
return FALSE
- var/armor_block = target.run_armor_check(affecting, RED_DAMAGE)
playsound(target.loc, user.dna.species.attack_sound, 25, TRUE, -1)
@@ -1428,10 +1427,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
target.dismembering_strike(user, affecting.body_zone)
if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage
- target.apply_damage(damage*1.5, user.dna.species.attack_type, affecting, armor_block)
+ target.deal_damage(damage*1.5, user.dna.species.attack_type, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
log_combat(user, target, "kicked")
else//other attacks deal full raw damage
- target.apply_damage(damage, user.dna.species.attack_type, affecting, armor_block)
+ target.deal_damage(damage, user.dna.species.attack_type, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting)
log_combat(user, target, "punched")
/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
@@ -1504,6 +1503,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
hit_area = affecting.name
var/def_zone = affecting.body_zone
+ // We run an armour check here for legacy reasons (it's used in a switch case to apply knockdowns or concussions for brute damage further below), but the armour calculation will happen inside the actual damage proc so it can account for the damage type shuffler.
var/armor_block
switch(I.damtype)
if(RED_DAMAGE, WHITE_DAMAGE, BLACK_DAMAGE, PALE_DAMAGE, MELEE, BULLET, LASER, ENERGY, BOMB, BIO, RAD, FIRE, ACID)
@@ -1527,7 +1527,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(istype(I, /obj/item/ego_weapon))
var/obj/item/ego_weapon/theweapon = I
damage *= theweapon.force_multiplier
- apply_damage((damage * weakness), I.damtype, def_zone, armor_block, H, wound_bonus = Iwound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), white_healable = TRUE)
+ apply_damage(H, (damage * weakness), I.damtype, source = user, flags = (DAMAGE_WHITE_HEALABLE), attack_type = (ATTACK_TYPE_MELEE), def_zone = def_zone, wound_bonus = Iwound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness())
if(!I.force)
return FALSE //item force is zero
@@ -1591,26 +1591,32 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return TRUE
-/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
- if(GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damagetype))
- var/datum/damage_type_shuffler/shuffler = GLOB.damage_type_shuffler
- var new_damage_type = shuffler.mapping_offense[damagetype]
- if(new_damage_type == PALE_DAMAGE && damagetype != PALE_DAMAGE)
- damage *= shuffler.pale_debuff
- else if(new_damage_type != PALE_DAMAGE && damagetype == PALE_DAMAGE)
- damage /= shuffler.pale_debuff
- damagetype = new_damage_type
- var/signal_return = SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone, wound_bonus, bare_wound_bonus, sharpness)
+// Due to belonging to a different type (datum/species), we can't pull functionality from mob/living's deal_damage. This is duplicate code with some additions for factoring in wounds and sharpness.
+/datum/species/proc/apply_damage(mob/living/carbon/human/H, damage_amount, damage_type, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
+ if(!damage_amount) // There are some extremely rare instances of 0 damage pre-armour reduction, for example King of Greed does a 0 damage HurtInTurf to fill up a hitlist to attack later.
+ return FALSE
+
+ // We have already run the shuffler in the mob/living/carbon deal_damage that called this proc. Any incoming damage has already been shuffled (if it is enabled, anyhow).
+
+ // Automatically run an armour check for the provided damage type if we weren't already provided with a blocked value, and if we aren't taking BRUTE damage.
+ if((isnull(blocked)) && (damage_type != BRUTE))
+ blocked = H.run_armor_check(def_zone, damage_type)
+
+ // We will now send a signal that gives listeners the opportunity to cancel the damage being dealt. For some reason, in the original apply_damage, this happens before a "final damage" calculation, so I have chosen to preserve that behaviour.
+ // Some examples of the listeners that may return COMPONENT_MOB_DENY_DAMAGE are manager shields, the Welfare Core reward, or Sweeper Persistence.
+ var/signal_return = SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMGE, damage_amount, damage_type, def_zone, source, flags, attack_type)
if(signal_return & COMPONENT_MOB_DENY_DAMAGE)
return FALSE
var/hit_percent = (100-(blocked+armor))/100
hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100
- if(!damage || (!forced && hit_percent <= 0))
- return 0
+ if(hit_percent <= 0)
+ return FALSE
+
+ // This snippet handles choosing a body part to apply the damage on, if we didn't choose to spread_damage.
var/obj/item/bodypart/BP = null
- if(!spread_damage)
+ if((flags & DAMAGE_NO_SPREAD)) // If we've been set to NOT spread damage, choose a body part to hit based on def_zone (we'll get one regardless if we have no def_zone)
if(isbodypart(def_zone))
BP = def_zone
else
@@ -1619,57 +1625,68 @@ GLOBAL_LIST_EMPTY(roundstart_races)
BP = H.get_bodypart(check_zone(def_zone))
if(!BP)
BP = H.bodyparts[1]
- switch(damagetype)
+
+ var/final_damage = damage_amount
+
+ var/piercing = flags & DAMAGE_PIERCING
+
+ switch(damage_type)
if(BRUTE, MELEE, BULLET, BOMB, ACID)
H.damageoverlaytemp = 20
- var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * brutemod * H.physiology.brute_mod
if(BP)
- if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
+ if(BP.receive_damage(final_damage, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
H.update_damage_overlays()
- new /obj/effect/temp_visual/damage_effect/red(get_turf(H), damage_amount) // Since bodypart damage bypasses bruteloss, we just make vfx here.
+ new /obj/effect/temp_visual/damage_effect/red(get_turf(H)) // Since bodypart damage bypasses bruteloss, we just make vfx here.
else//no bodypart, we deal damage with a more general method.
- H.adjustBruteLoss(damage_amount)
+ H.adjustBruteLoss(final_damage)
if(FIRE, LASER, ENERGY, RAD)
H.damageoverlaytemp = 20
- var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * burnmod * H.physiology.burn_mod
if(BP)
- if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
+ if(BP.receive_damage(0, final_damage, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness))
H.update_damage_overlays()
- new /obj/effect/temp_visual/damage_effect/burn(get_turf(H), damage_amount)
+ new /obj/effect/temp_visual/damage_effect/burn(get_turf(H))
else
- H.adjustFireLoss(damage_amount)
+ H.adjustFireLoss(final_damage)
if(TOX, BIO)
- var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod
- H.adjustToxLoss(damage_amount)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * H.physiology.tox_mod
+ H.adjustToxLoss(final_damage)
if(OXY)
- var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.oxy_mod
- H.adjustOxyLoss(damage_amount)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * H.physiology.oxy_mod
+ H.adjustOxyLoss(final_damage)
if(CLONE)
- var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.clone_mod
- H.adjustCloneLoss(damage_amount)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * H.physiology.clone_mod
+ H.adjustCloneLoss(final_damage)
if(STAMINA)
- var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * H.physiology.stamina_mod
if(BP)
- if(BP.receive_damage(0, 0, damage_amount))
+ if(BP.receive_damage(0, 0, final_damage))
H.update_stamina()
else
- H.adjustStaminaLoss(damage_amount)
+ H.adjustStaminaLoss(final_damage)
if(BRAIN)
- var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod
- H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * H.physiology.brain_mod
+ H.adjustOrganLoss(ORGAN_SLOT_BRAIN, final_damage)
if(RED_DAMAGE)
- var/damage_amount = forced ? damage : damage * hit_percent * redmod * H.physiology.red_mod
- H.adjustRedLoss(damage_amount, forced = forced)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * redmod * H.physiology.red_mod
+ H.adjustRedLoss(final_damage, forced = piercing)
if(WHITE_DAMAGE)
- var/damage_amount = forced ? damage : damage * hit_percent * whitemod * H.physiology.white_mod
- H.adjustWhiteLoss(damage_amount, forced = forced, white_healable = white_healable)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * whitemod * H.physiology.white_mod
+ H.adjustWhiteLoss(final_damage, forced = piercing, white_healable = flags & (DAMAGE_WHITE_HEALABLE))
if(BLACK_DAMAGE)
- var/damage_amount = forced ? damage : damage * hit_percent * blackmod * H.physiology.black_mod
- H.adjustBlackLoss(damage_amount, forced = forced, white_healable = white_healable)
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * blackmod * H.physiology.black_mod
+ H.adjustBlackLoss(final_damage, forced = piercing, white_healable = flags & (DAMAGE_WHITE_HEALABLE))
if(PALE_DAMAGE)
- var/damage_amount = forced ? damage : damage * hit_percent * palemod * H.physiology.pale_mod
- H.adjustPaleLoss(damage_amount, forced = forced)
- return 1
+ final_damage = piercing ? damage_amount : damage_amount * hit_percent * palemod * H.physiology.pale_mod
+ H.adjustPaleLoss(final_damage, forced = piercing)
+
+ SEND_SIGNAL(H, COMSIG_MOB_AFTER_APPLY_DAMGE, final_damage, damage_type, def_zone, wound_bonus, bare_wound_bonus, sharpness, source, flags, attack_type)
+
+ if(flags & DAMAGE_UNTRACKABLE)
+ source = null
+
+ return final_damage
/datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H)
// called when hit by a projectile
@@ -1879,7 +1896,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
humi.emote("scream")
// Apply the damage to all body parts
- humi.apply_damage(burn_damage, FIRE, spread_damage = TRUE)
+ humi.deal_damage(burn_damage, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
// Apply some burn / brute damage to the body (Dependent if the person is hulk or not)
var/is_hulk = HAS_TRAIT(humi, TRAIT_HULK)
@@ -1891,11 +1908,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/damage_mod = coldmod * humi.physiology.cold_mod * (is_hulk ? HULK_COLD_DAMAGE_MOD : 1)
switch(humi.coretemperature)
if(-INFINITY to 119)
- humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod, damage_type)
+ humi.deal_damage(COLD_DAMAGE_LEVEL_3 * damage_mod, damage_type, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(120 to 200)
- humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod, damage_type)
+ humi.deal_damage(COLD_DAMAGE_LEVEL_2 * damage_mod, damage_type, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
else
- humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod, damage_type)
+ humi.deal_damage(COLD_DAMAGE_LEVEL_1 * damage_mod, damage_type, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
/**
@@ -1938,7 +1955,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800)
burn_damage = HEAT_DAMAGE_LEVEL_3
- humi.apply_damage(burn_damage, FIRE, bodypart)
+ humi.deal_damage(burn_damage, FIRE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT), def_zone = bodypart)
/// Handle the air pressure of the environment
/datum/species/proc/handle_environment_pressure(datum/gas_mixture/environment, mob/living/carbon/human/H)
@@ -2058,7 +2075,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12))
*/
if(thermal_protection <= FIRE_SUIT_MAX_TEMP_PROTECT || no_protection)
- H.deal_damage(2, FIRE)
+ H.deal_damage(2, FIRE, flags = (DAMAGE_FORCED))
/datum/species/proc/CanIgniteMob(mob/living/carbon/human/H)
if(HAS_TRAIT(H, TRAIT_NOFIRE))
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 783397affe47..36fe9bc319c8 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -145,18 +145,18 @@
if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER)
H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 2)
if(H.health > 10.5)
- apply_damage(0.65, TOX, null, null, H)
+ apply_damage(H, 0.65, TOX, flags = (DAMAGE_FORCED))
brutemod = 1.75
if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL)
H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 1)
brutemod = 1.5
if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD)
H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 1)
- apply_damage(0.2, TOX, null, null, H)
+ apply_damage(H, 0.2, TOX, flags = (DAMAGE_FORCED))
brutemod = 1.5
if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 2)
- apply_damage(0.65, TOX, null, null, H)
+ apply_damage(H, 0.65, TOX, flags = (DAMAGE_FORCED))
brutemod = 1.75
if(prob(10)) //10% each tick for ethereals to explosively release excess energy if it reaches dangerous levels
discharge_process(H)
diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
index b619a4d75cf3..9ea6ffec43a1 100644
--- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm
+++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
@@ -77,7 +77,7 @@
span_danger("You avoid [user]'s bite!"), span_hear("You hear jaws snapping shut!"), COMBAT_MESSAGE_RANGE, user)
to_chat(user, span_danger("Your bite misses [victim]!"))
return TRUE
- victim.apply_damage(rand(punchdamagelow, punchdamagehigh), BRUTE, affecting, armor)
+ victim.deal_damage(rand(punchdamagelow, punchdamagehigh), BRUTE, source = user, attack_type = (ATTACK_TYPE_MELEE), def_zone = affecting, blocked = armor)
victim.visible_message(span_danger("[name] bites [victim]!"),
span_userdanger("[name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, name)
to_chat(user, span_danger("You bite [victim]!"))
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 378bfc5e5a69..d4728e32007e 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -46,7 +46,7 @@
/datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount)
. = min(20, amount)
-/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, spread_damage = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
+/datum/species/zombie/infectious/apply_damage(mob/living/carbon/human/H, damage_amount, damage_type, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
. = ..()
if(.)
regen_cooldown = world.time + REGENERATION_DELAY
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 7ca2d48f61c5..3cf59110c810 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -1,54 +1,3 @@
-
-/**
- * Applies damage to this mob
- *
- * Sends [COMSIG_MOB_APPLY_DAMGE]
- *
- * Arguuments:
- * * damage - amount of damage
- * * damagetype - one of [BRUTE], [FIRE], [TOX], [OXY], [CLONE], [STAMINA]
- * * def_zone - zone that is being hit if any
- * * blocked - armor value applied
- * * forced - bypass hit percentage
- * * spread_damage - used in overrides
- *
- * Returns TRUE if damage applied
- */
-/mob/living/proc/apply_damage(damage = 0,damagetype = RED_DAMAGE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
- if(GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damagetype))
- var/datum/damage_type_shuffler/shuffler = GLOB.damage_type_shuffler
- var new_damage_type = shuffler.mapping_offense[damagetype]
- damagetype = new_damage_type
- var/signal_return = SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage, damagetype, def_zone)
- if(signal_return & COMPONENT_MOB_DENY_DAMAGE)
- return FALSE
- var/hit_percent = (100-blocked)/100
- if(!damage || (!forced && hit_percent <= 0))
- return FALSE
- var/damage_amount = forced ? damage : damage * hit_percent
- switch(damagetype)
- if(FIRE)
- adjustFireLoss(damage_amount, forced = forced)
- if(TOX)
- adjustToxLoss(damage_amount, forced = forced)
- if(OXY)
- adjustOxyLoss(damage_amount, forced = forced)
- if(CLONE)
- adjustCloneLoss(damage_amount, forced = forced)
- if(STAMINA)
- adjustStaminaLoss(damage_amount, forced = forced)
- if(RED_DAMAGE)
- adjustRedLoss(damage_amount, forced = forced)
- if(WHITE_DAMAGE)
- adjustWhiteLoss(damage_amount, forced = forced, white_healable = white_healable)
- if(BLACK_DAMAGE)
- adjustBlackLoss(damage_amount, forced = forced, white_healable = white_healable)
- if(PALE_DAMAGE)
- adjustPaleLoss(damage_amount, forced = forced)
- else
- adjustBruteLoss(damage_amount, forced = forced)
- return TRUE
-
///like [apply_damage][/mob/living/proc/apply_damage] except it always uses the damage procs
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE)
switch(damagetype)
@@ -89,24 +38,25 @@
if(STAMINA)
return getStaminaLoss()
-/// applies multiple damages at once via [/mob/living/proc/apply_damage]
-/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0)
+/// applies multiple damages at once via [/mob/living/proc/deal_damage]
+// I recommend not using this, also literally only 1 thing (flashbangs) in the codebase uses this as of now
+/mob/living/proc/deal_multiple_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0)
if(blocked >= 100)
return 0
if(brute)
- apply_damage(brute, BRUTE, def_zone, blocked)
+ deal_damage(brute, BRUTE, def_zone = def_zone, blocked = blocked)
if(burn)
- apply_damage(burn, FIRE, def_zone, blocked)
+ deal_damage(burn, FIRE, def_zone = def_zone, blocked = blocked)
if(tox)
- apply_damage(tox, TOX, def_zone, blocked)
+ deal_damage(tox, TOX, def_zone = def_zone, blocked = blocked)
if(oxy)
- apply_damage(oxy, OXY, def_zone, blocked)
+ deal_damage(oxy, OXY, def_zone = def_zone, blocked = blocked)
if(clone)
- apply_damage(clone, CLONE, def_zone, blocked)
+ deal_damage(clone, CLONE, def_zone = def_zone, blocked = blocked)
if(stamina)
- apply_damage(stamina, STAMINA, def_zone, blocked)
+ deal_damage(stamina, STAMINA, def_zone = def_zone, blocked = blocked)
if(brain)
- apply_damage(brain, BRAIN, def_zone, blocked)
+ deal_damage(brain, BRAIN, def_zone = def_zone, blocked = blocked)
return 1
@@ -168,7 +118,7 @@
if(drowsy)
apply_effect(drowsy, EFFECT_DROWSY, blocked)
if(stamina)
- apply_damage(stamina, STAMINA, null, blocked)
+ deal_damage(stamina, STAMINA, blocked = blocked)
if(jitter)
apply_effect(jitter, EFFECT_JITTER, blocked)
return TRUE
@@ -192,7 +142,7 @@
if(!forced && (status_flags & GODMODE))
return
. = oxyloss
- oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, -HEALTH_THRESHOLD_DEAD)
+ oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2)
if(updating_health)
updatehealth()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0a58ac213836..d2456bdd0015 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1174,7 +1174,7 @@
var/blocked = getarmor(null, RAD)
if(amount > RAD_BURN_THRESHOLD)
- apply_damage(RAD_BURN_CURVE(amount), FIRE, null, blocked)
+ deal_damage(RAD_BURN_CURVE(amount), FIRE, flags = (DAMAGE_FORCED), blocked = blocked)
apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), EFFECT_IRRADIATE, blocked)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 7778491500e3..c146c5713130 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -52,7 +52,7 @@
var/armor = run_armor_check(def_zone, P.damage_type, "","",P.armour_penetration)
var/on_hit_state = P.on_hit(src, armor, piercing_hit)
if(!P.nodamage && on_hit_state != BULLET_ACT_BLOCK)
- apply_damage(P.damage, P.damage_type, def_zone, armor, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness = P.sharpness, white_healable = P.white_healing)
+ deal_damage(P.damage, P.damage_type, source = P.firer, flags = P.white_healing ? (DAMAGE_WHITE_HEALABLE) : null, attack_type = (ATTACK_TYPE_RANGED), def_zone = def_zone, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness = P.sharpness)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize)
if(P.dismemberment)
check_projectile_dismemberment(P, def_zone)
@@ -90,12 +90,11 @@
span_userdanger("You're hit by [thrown_item]!"))
if(!thrown_item.throwforce)
return
- var/armor = run_armor_check(zone, thrown_item.damtype, "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].", thrown_item.armour_penetration)
var/justice_mod = 1
if(ishuman(thrown_item.thrownby))
var/mob/living/carbon/human/H = thrown_item.thrownby
justice_mod += get_modified_attribute_level(H, JUSTICE_ATTRIBUTE)/100
- apply_damage(thrown_item.throwforce * justice_mod, thrown_item.damtype, zone, armor, sharpness = thrown_item.get_sharpness(), wound_bonus = (nosell_hit * CANT_WOUND))
+ deal_damage(thrown_item.throwforce * justice_mod, thrown_item.damtype, source = thrown_item.thrownby, flags = (DAMAGE_WHITE_HEALABLE), attack_type = (ATTACK_TYPE_THROWING), def_zone = zone, wound_bonus = (nosell_hit * CANT_WOUND))
if(QDELETED(src)) //Damage can delete the mob.
return
return ..()
@@ -468,3 +467,16 @@
// A proc used in CanAttack of simple mobs
/mob/living/proc/CanBeAttacked()
return TRUE
+
+/// Called by the deal_damage() wrapper when it doesn't receive DAMAGE_FORCED in its "flags" argument. Return TRUE to receive the damage, return FALSE to prevent damage from being taken.
+// "Forced" damage will not call this, and thus you won't be able to stop it from happening with this proc. Look into COMPONENT_MOB_DENY_DAMAGE.
+// Consider that 'source' argument might be null and handle accordingly. This is often the case for status effects and mobs that qdel themselves after dealing their damage. I didn't want to handle it for all possible implementations, that would be restrictive.
+// The "attack_type" argument is a bitfield, and it is also optional. You can check here if you specifically don't want to react/want to react to certain attack types, or modify behaviour according to the type. Just remember that it may be null, and that you may have several attack types as well.
+/mob/living/proc/PreDamageReaction(damage_amount, damage_type, source, attack_type)
+ SHOULD_NOT_SLEEP(TRUE)
+ return TRUE
+
+/// Called always after deal_damage() goes through, if the mob's alive. Irrelevant return value.
+// /simple_animal's override will return damage post-shuffler-defense mapping, so you can factor it in for whatever you may want.
+/mob/living/proc/PostDamageReaction(damage_amount, damage_type, source, attack_type)
+ return
diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm
index e76ead85bd52..678a97ed2450 100644
--- a/code/modules/mob/living/silicon/damage_procs.dm
+++ b/code/modules/mob/living/silicon/damage_procs.dm
@@ -1,14 +1,46 @@
+// For some reason we still have silicons in our codebase, and for some reason they take damage differently than other mobs (they don't take certain types of damage) so here we go with some duplicated code
+/mob/living/silicon/deal_damage(damage_amount, damage_type, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
+ if(!damage_amount) // There are some extremely rare instances of 0 damage pre-armour reduction, for example King of Greed does a 0 damage HurtInTurf to fill up a hitlist to attack later.
+ return FALSE
-/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
+ // Damage shuffler station trait.
+ if(GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damage_type))
+ var/datum/damage_type_shuffler/shuffler = GLOB.damage_type_shuffler
+ var/new_damage_type = shuffler.mapping_offense[damage_type]
+ damage_type = new_damage_type
+
+ if(!(damage_type in list(BRUTE, RED_DAMAGE, BLACK_DAMAGE, FIRE))) // Silicons will only take these damage types
+ return FALSE
+
+ if((!(flags & DAMAGE_FORCED)) && (!PreDamageReaction(damage_amount, damage_type, source, attack_type))) // If our forced argument isn't TRUE, then we expect to receive a TRUE from PreDamageReaction to continue the proc.
+ return FALSE
+
+ // We will now send a signal that gives listeners the opportunity to cancel the damage being dealt. For some reason, in the original apply_damage, this happens before a "final damage" calculation, so I have chosen to preserve that behaviour.
+ // Some examples of the listeners that may return COMPONENT_MOB_DENY_DAMAGE are manager shields, the Welfare Core reward, or Sweeper Persistence.
+ var/signal_return = SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMGE, damage_amount, damage_type, def_zone, source, flags, attack_type)
+ if(signal_return & COMPONENT_MOB_DENY_DAMAGE)
+ return FALSE
+
+ // Automatically run an armour check for the provided damage type if we weren't already provided with a blocked value, and if we aren't taking BRUTE damage.
+ if((isnull(blocked)) && (damage_type != BRUTE))
+ blocked = run_armor_check(null, damage_type)
var/hit_percent = (100-blocked)/100
- if((!damage || (!forced && hit_percent <= 0)))
- return 0
- var/damage_amount = forced ? damage : damage * hit_percent
- switch(damagetype)
+ var/bypass_resistance = flags & DAMAGE_PIERCING
+
+ if(hit_percent <= 0 && !(bypass_resistance))
+ return FALSE
+
+ var/final_damage = bypass_resistance ? damage_amount : damage_amount * hit_percent
+
+ switch(damage_type)
if(BRUTE)
- adjustBruteLoss(damage_amount, forced = forced)
+ adjustBruteLoss(final_damage, forced = bypass_resistance)
if(FIRE)
- adjustFireLoss(damage_amount, forced = forced)
+ adjustFireLoss(final_damage, forced = bypass_resistance)
+ if(RED_DAMAGE)
+ adjustRedLoss(final_damage, forced = bypass_resistance)
+ if(BLACK_DAMAGE)
+ adjustBlackLoss(final_damage, forced = bypass_resistance)
return 1
diff --git a/code/modules/mob/living/simple_animal/_damage_coeff.dm b/code/modules/mob/living/simple_animal/_damage_coeff.dm
index 758e9c48df4c..e5955f64ddd8 100644
--- a/code/modules/mob/living/simple_animal/_damage_coeff.dm
+++ b/code/modules/mob/living/simple_animal/_damage_coeff.dm
@@ -1,9 +1,9 @@
-#define DAMCOEFFID "damage_coeff-[red]-[white]-[black]-[pale]-[brute]-[fire]-[tox]-[clone]-[stamina]-[oxy]"
+#define DAMCOEFFID "damage_coeff-[red]-[white]-[black]-[pale]-[brute]-[fire]-[tox]-[clone]-[stamina]-[oxy]-[aggro]"
-/proc/getDamCoeff(red = 1, white = 1, black = 1, pale = 1, brute = 1, fire = 1, tox = 1, clone = 1, stamina = 1, oxy = 1)
+/proc/getDamCoeff(red = 1, white = 1, black = 1, pale = 1, brute = 1, fire = 1, tox = 1, clone = 1, stamina = 1, oxy = 1, aggro = 1)
. = locate(DAMCOEFFID)
if(!.)
- . = new /datum/dam_coeff(red, white, black, pale, brute, fire, tox, clone, stamina, oxy)
+ . = new /datum/dam_coeff(red, white, black, pale, brute, fire, tox, clone, stamina, oxy, aggro)
/proc/makeDamCoeff(list/dc = list())
var/list/coeffs = list(RED_DAMAGE = 1, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1, PALE_DAMAGE = 1, BRUTE = 1, FIRE = 1, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1)
@@ -23,8 +23,9 @@
var/white
var/black
var/pale
+ var/aggro
-/datum/dam_coeff/New(red = 1, white = 1, black = 1, pale = 1, brute = 1, fire = 1, tox = 1, clone = 1, stamina = 1, oxy = 1)
+/datum/dam_coeff/New(red = 1, white = 1, black = 1, pale = 1, brute = 1, fire = 1, tox = 1, clone = 1, stamina = 1, oxy = 1, aggro = 1)
src.red = red
src.white = white
src.black = black
@@ -35,10 +36,11 @@
src.clone = clone
src.stamina = stamina
src.oxy = oxy
+ src.aggro = aggro
tag = DAMCOEFFID
-/datum/dam_coeff/proc/modifyCoeff(red = 0, white = 0, black = 0, pale = 0, brute = 0, fire = 0, tox = 0, clone = 0, stamina = 0, oxy = 0)
- return getDamCoeff(src.red+red, src.white+white, src.black+black, src.pale+pale, src.brute+brute, src.fire+fire, src.tox+tox, src.clone+clone, src.stamina+stamina, src.oxy+oxy)
+/datum/dam_coeff/proc/modifyCoeff(red = 0, white = 0, black = 0, pale = 0, brute = 0, fire = 0, tox = 0, clone = 0, stamina = 0, oxy = 0, aggro = 0)
+ return getDamCoeff(src.red+red, src.white+white, src.black+black, src.pale+pale, src.brute+brute, src.fire+fire, src.tox+tox, src.clone+clone, src.stamina+stamina, src.oxy+oxy, src.aggro+aggro)
/datum/dam_coeff/proc/setCoeff(red, white, black, pale, brute, fire, tox, clone, stamina, oxy)
return getDamCoeff((isnull(red) ? src.red : red),\
@@ -50,13 +52,14 @@
(isnull(tox) ? src.tox : clone),\
(isnull(clone) ? src.clone : clone),\
(isnull(stamina) ? src.stamina : stamina),\
- (isnull(oxy) ? src.oxy : oxy))
+ (isnull(oxy) ? src.oxy : oxy),\
+ (isnull(aggro) ? src.aggro : aggro))
/datum/dam_coeff/proc/getCoeff(coeff)
return vars[coeff]
/datum/dam_coeff/proc/getList()
- return list(RED_DAMAGE = red, WHITE_DAMAGE = white, BLACK_DAMAGE = black, PALE_DAMAGE = pale, BRUTE = brute, FIRE = fire, TOX = tox, CLONE = clone, STAMINA = stamina, OXY = oxy)
+ return list(RED_DAMAGE = red, WHITE_DAMAGE = white, BLACK_DAMAGE = black, PALE_DAMAGE = pale, BRUTE = brute, FIRE = fire, TOX = tox, CLONE = clone, STAMINA = stamina, OXY = oxy, AGGRO_DAMAGE = aggro)
/datum/dam_coeff/vv_edit_var(var_name, var_value)
if (var_name == NAMEOF(src, tag))
diff --git a/code/modules/mob/living/simple_animal/abnormality/!tutorial/cube.dm b/code/modules/mob/living/simple_animal/abnormality/!tutorial/cube.dm
index fc271d0170ec..880b43456be3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/!tutorial/cube.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/!tutorial/cube.dm
@@ -56,6 +56,6 @@
for(var/mob/living/L in livinginview(8, src))
if(faction_check_mob(L))
continue
- L.deal_damage(pulse_damage, WHITE_DAMAGE)
+ L.deal_damage(pulse_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
diff --git a/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm b/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm
index 0c37de73d6a6..7a35f1a3c71b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_abnormality.dm
@@ -462,7 +462,7 @@ The variable's key needs to be non-numerical.*/
// Additional effect on each individual work tick failure
/mob/living/simple_animal/hostile/abnormality/proc/WorktickFailure(mob/living/carbon/human/user)
- user.deal_damage(rand(work_damage_lower,work_damage_upper), work_damage_type)
+ user.deal_split_damage(rand(work_damage_lower,work_damage_upper), work_damage_type, source = src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER))
WorkDamageEffect()
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/aleph/crying_children.dm b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/aleph/crying_children.dm
index 99b2f07659ca..4e50bad300cc 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/aleph/crying_children.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/aleph/crying_children.dm
@@ -188,8 +188,8 @@
continue
to_chat(L, span_userdanger("You're boiling alive from the heat of a miniature sun!"))
playsound(L, 'sound/abnormalities/crying_children/attack_aoe.ogg', 50, TRUE)
- L.deal_damage(175, RED_DAMAGE)
- L.deal_damage(75, FIRE)
+ L.deal_damage(175, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
+ L.deal_damage(75, FIRE, src, attack_type = (ATTACK_TYPE_SPECIAL))
L.apply_lc_burn(50)
new /obj/effect/temp_visual/fire/fast(get_turf(L))
@@ -310,7 +310,7 @@
S.pixel_x = rand(-8, 8)
S.pixel_y = rand(-8, 8)
animate(S, alpha = 0, time = 1.5)
- var/list/new_hits = HurtInTurf(T, been_hit, 60, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(T, been_hit, 60, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
to_chat(L, span_userdanger("[src] stabs you!"))
@@ -368,7 +368,7 @@
playsound(src, 'sound/abnormalities/crying_children/attack_aoe.ogg', 50, FALSE)
for(var/turf/T in view(4, src))
new /obj/effect/temp_visual/fire/fast(T)
- var/list/new_hits = HurtInTurf(T, been_hit, 250, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(T, been_hit, 250, RED_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
to_chat(L, span_userdanger("You were scorched by [src]'s flames!"))
@@ -506,9 +506,9 @@
toggle_ai(initial(src.AIStatus))
for(var/mob/living/carbon/human/H in view(src, 10)) // Immediately attacks on getting tagged
if(get_dist(src, H) < get_dist(src, target))
- target = H
+ FindTarget(list(H), TRUE)
if(!target)
- target = H
+ FindTarget(list(H), TRUE)
if(target in view(1, src))
AttackingTarget(target)
tagged = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm
index e6e38eef7505..75a651813e34 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_auxiliary_modes/community/ego_weapons.dm
@@ -195,7 +195,7 @@
playsound(T, 'sound/weapons/fixer/generic/fire3.ogg', 30, TRUE, 3)
new /obj/effect/temp_visual/smash_effect(T)
new /obj/effect/temp_visual/fire/fast(T)
- been_hit = user.HurtInTurf(T, been_hit, aoe_damage, FIRE, check_faction = TRUE)
+ been_hit = user.HurtInTurf(T, been_hit, aoe_damage, FIRE, check_faction = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/obj/item/ego_weapon/gleaming/get_clamped_volume()
return 40
@@ -317,7 +317,7 @@
continue
if(special_checks_faction && source.faction_check_mob(L))
continue
- L.apply_damage(10, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(10, RED_DAMAGE, source, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_COUNTER))
L.apply_lc_burn(2)
..()
@@ -373,7 +373,7 @@
if(L in been_hit || L == user)
continue
user.visible_message(span_boldwarning("[user] blazes through [L]!"))
- L.apply_damage((special_damage + extra_damage), RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage((special_damage + extra_damage), RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
been_hit += L
// Remove burn if it's safety is on
@@ -513,7 +513,7 @@
for(var/turf/T in view(1, target))
var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(T)
FX.color = "#96BB00"
- user.HurtInTurf(T, list(), damage_dealt, BLACK_DAMAGE, check_faction = TRUE)
+ user.HurtInTurf(T, list(), damage_dealt, BLACK_DAMAGE, check_faction = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
return
/obj/effect/decal/cleanable/liquid_miasma
@@ -568,7 +568,7 @@
if(!isliving(AM))
return FALSE
var/mob/living/L = AM
- L.deal_damage(damage_dealt, BLACK_DAMAGE)
+ L.deal_damage(damage_dealt, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
new /obj/effect/temp_visual/damage_effect/black(get_turf(L))
/obj/effect/gibspawner/generic/silent/liquid_miasma
@@ -869,7 +869,7 @@
UnregisterSignal(owner, COMSIG_ATOM_BULLET_ACT)
if(!current_damage)//0 damage stacked
return
- owner.apply_damage(current_damage, BLACK_DAMAGE)
+ owner.deal_damage(current_damage, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
new /obj/effect/temp_visual/explosion(get_turf(owner))
/datum/status_effect/display/crash_curse/proc/stack_damage()
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/he/researcher.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/he/researcher.dm
index 2f4c4d50fd96..b0abc05eebaa 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/he/researcher.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/he/researcher.dm
@@ -83,9 +83,9 @@
continue
if(ishuman(affected_mob)) //deals less damage to humans
var/mob/living/carbon/human/human_mob = affected_mob
- human_mob.deal_damage(human_damage, RED_DAMAGE)
+ human_mob.deal_damage(human_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
continue
- affected_mob.deal_damage(damage_dealt, RED_DAMAGE)
+ affected_mob.deal_damage(damage_dealt, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
var/datum/effect_system/smoke_spread/smoke_effect = new
smoke_effect.set_up(7, get_turf(owner))
smoke_effect.start()
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/he/theonite_slab.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/he/theonite_slab.dm
index f62dc42d3a40..0e2c1fa232ae 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/he/theonite_slab.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/he/theonite_slab.dm
@@ -147,13 +147,13 @@
new /obj/effect/temp_visual/smash_effect(T)
for(var/mob/living/M in T)
if(!ishuman(M))
- M.deal_damage(damage, PALE_DAMAGE)
+ M.deal_damage(damage, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
continue
var/mob/living/carbon/human/H = M //deals damage to non-humans, and humans - but only humans with the status effect.
var/datum/status_effect/stacking/slab/S = H.has_status_effect(/datum/status_effect/stacking/slab)
if(!S)
continue
- M.deal_damage(damage, PALE_DAMAGE)
+ M.deal_damage(damage, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
if(M.health < 0)
S.PunishDeath(M)
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/he/treesap.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/he/treesap.dm
index cfad2b987624..6c3b1489560d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/he/treesap.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/he/treesap.dm
@@ -55,8 +55,7 @@
/datum/status_effect/treesap/tick()
. = ..()
- owner.adjustBruteLoss(-12) // Heals 10 HP per tick in LC, so this really should be 20
-
+ owner.adjustBruteLoss(-10) // Heals 10 HP per tick in LC
// Status Effect
/datum/status_effect/boomsap
@@ -67,13 +66,13 @@
/datum/status_effect/boomsap/tick()
. = ..()
- owner.adjustBruteLoss(-12) // Heals 10 HP per tick in LC, so this really should be 20
+ owner.adjustBruteLoss(-10) // Heals 10 HP per tick in LC
/datum/status_effect/boomsap/on_remove()
. = ..()
owner.gib()
for(var/mob/living/carbon/human/L in urange(10, src))
- L.deal_damage(60, WHITE_DAMAGE)
+ L.deal_damage(30, WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
to_chat(L, span_danger("Oh god, what the fuck was that!?"))
#undef STATUS_EFFECT_TREESAP
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/teth/bracelet.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/teth/bracelet.dm
index 2a4887970464..856726509937 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/teth/bracelet.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/teth/bracelet.dm
@@ -20,7 +20,7 @@
if(user.health != user.maxHealth) // check for oxyloss, because of anemics
if(user.oxyloss > 0)
to_chat(user, span_userdanger("You put the bracelet back, feeling as if you body wanted to tear itself apart!"))
- user.deal_damage(user.health * 0.75, BRUTE)
+ user.deal_damage(user.health * 0.75, BRUTE, flags = (DAMAGE_FORCED))
else
to_chat(user, span_userdanger("You put the bracelet back, and feel your heart explode!"))
user.gib()
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/teth/heart.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/teth/heart.dm
index 0bf14c7e42d1..f0b28656921e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/teth/heart.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/teth/heart.dm
@@ -51,7 +51,7 @@
var/mob/living/carbon/human/H = owner
HealthCheck()
if(ferventbeats && rage_safe_time < world.time)
- H.deal_damage(H.maxHealth * (1/100), BRUTE) // Roughly standard regenerator healing
+ H.deal_damage(H.maxHealth * (1/100), BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS)) // Roughly standard regenerator healing
if(!raging)
return
@@ -59,7 +59,7 @@
to_chat(H, span_userdanger("You feel as if your heart barelly holds onto life!"))
return
- H.deal_damage(H.maxHealth * (2/100), BRUTE) // You are most likely going to die, and very soon.
+ H.deal_damage(H.maxHealth * (2/100), BRUTE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS)) // You are most likely going to die, and very soon.
/datum/status_effect/display/aspiration/proc/HealthCheck()
var/mob/living/carbon/human/H = owner
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/teth/theresia.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/teth/theresia.dm
index c7b32b2c4b75..87d54b5b10d0 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/teth/theresia.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/teth/theresia.dm
@@ -53,7 +53,7 @@
playsound(get_turf(src), 'sound/machines/clockcult/ark_scream.ogg', 50, 0, 24)
new /obj/effect/temp_visual/fragment_song(get_turf(src))
for(var/mob/living/carbon/human/H in livinginrange(32, get_turf(src)))
- H.deal_damage(pulse_damage, WHITE_DAMAGE)
+ H.deal_damage(pulse_damage, WHITE_DAMAGE, source = src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))
return
// Healing effect
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/waw/clock.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/waw/clock.dm
index 214ee10c0195..49450a71e835 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/waw/clock.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/waw/clock.dm
@@ -92,11 +92,11 @@
if(A in exceptions)
continue
new /obj/effect/temp_visual/sparks/quantum(A)
- A.deal_damage(damage_dealt, BRUTE)
+ A.deal_damage(damage_dealt, BRUTE, source = src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))
for(var/mob/living/L in GLOB.ordeal_list)
new /obj/effect/temp_visual/sparks/quantum(L)
- L.deal_damage(damage_dealt, BRUTE)
+ L.deal_damage(damage_dealt, BRUTE, source = src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))
/obj/structure/toolabnormality/clock/update_overlays()
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/waw/dr_jekyll.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/waw/dr_jekyll.dm
index 5e5b5f6fc311..eb6d6eaa1424 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/waw/dr_jekyll.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/waw/dr_jekyll.dm
@@ -32,7 +32,7 @@
else //They messed up
to_chat(user, span_userdanger("HA! You won't get rid of me that easily!"))
playsound(get_turf(user), 'sound/abnormalities/someonesportrait/panic.ogg', 40, FALSE, -5)
- user.apply_damage(999, WHITE_DAMAGE, null, user.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)//DIE!
+ user.deal_damage(999, WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))//DIE!
return
// Status Effects
diff --git a/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/touch.dm b/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/touch.dm
index 4017d67ad4a5..b33dcc91ca11 100644
--- a/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/touch.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/_tools/zayin/touch.dm
@@ -65,7 +65,7 @@
M.playsound_local(M, 'sound/abnormalities/donttouch/panic.ogg', 50, FALSE)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.apply_damage(5000, WHITE_DAMAGE, null, null, spread_damage = TRUE) // You cannot escape.
+ H.deal_damage(5000, WHITE_DAMAGE, flags = (DAMAGE_FORCED | DAMAGE_PIERCING)) // You cannot escape.
/obj/structure/toolabnormality/touch/proc/BreachEffect(mob/living/carbon/human/user)
if(!do_after(user, 60 SECONDS))
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm
index 987218e3cb63..8416e3fca146 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/army_in_black.dm
@@ -312,7 +312,7 @@ GLOBAL_LIST_EMPTY(army)
continue
P.datum_reference.qliphoth_change(-1)
for(var/mob/living/carbon/human/H in view(20, src))
- H.deal_damage(boom_damage, WHITE_DAMAGE)
+ H.deal_damage(boom_damage, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/black_explosion(get_turf(src))
qdel(src)
@@ -351,7 +351,7 @@ GLOBAL_LIST_EMPTY(army)
for(var/mob/living/L in view(4, src))
if(faction_check_mob(L))
continue
- L.deal_damage(25, BLACK_DAMAGE)
+ L.deal_damage(25, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/abnormalities/armyinblack/black_attack.ogg', 100, 0, 8)
shot_cooldown = world.time + shot_cooldown_time
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm
index 14c84883d150..7ce9c4eb2a2e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/black_sun.dm
@@ -186,7 +186,7 @@
continue
if(faction_check_mob(L))
continue
- L.deal_damage(3, WHITE_DAMAGE)
+ L.deal_damage(3, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/bluespace_fissure(get_turf(L))
if(prob(10))
@@ -215,8 +215,8 @@
/obj/effect/temp_visual/blacksun_laser/proc/blowup()
playsound(src, 'sound/weapons/laser.ogg', 10, FALSE, 4)
for(var/mob/living/carbon/human/H in src.loc)
- H.deal_damage(20, WHITE_DAMAGE)
- H.deal_damage(30, PALE_DAMAGE)
+ H.deal_damage(20, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))
+ H.deal_damage(30, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))
if(H.sanity_lost)
H.gib()
@@ -233,7 +233,7 @@
for(var/mob/living/carbon/human/L in T)
if(L.sanity_lost) //Kill the insane
L.death()
- L.deal_damage(60, BLACK_DAMAGE)
+ L.deal_damage(60, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_ENVIRONMENT))
all_turfs -= T
SLEEP_CHECK_DEATH(5)
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm
index 8330b971dce4..cc627de5b82c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/blue_star.dm
@@ -103,7 +103,7 @@
if(faction_check_mob(L))
continue
var/falloff = (0.3 * (get_dist(src, L)))//1 damage for every 3 tiles
- L.deal_damage(pulse_damage - falloff, WHITE_DAMAGE)
+ L.deal_damage(pulse_damage - falloff, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
flash_color(L, flash_color = COLOR_BLUE_LIGHT, flash_time = 70)
if(!ishuman(L))
continue
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm
index eb71d77d6795..0bc0b9e078a3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/censored.dm
@@ -200,7 +200,7 @@
Beam(T, "censored", time = 10)
playsound(src, 'sound/weapons/ego/censored3.ogg', 75, FALSE, 5)
for(var/turf/TT in turf_list)
- for(var/mob/living/L in HurtInTurf(TT, list(), ability_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(TT, list(), ability_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL)))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
L.apply_status_effect(STATUS_EFFECT_OVERWHELMING_FEAR)
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm
index fc33ced132a9..2fc7578bb80a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/distortedform.dm
@@ -563,7 +563,7 @@
continue
if(L.stat == DEAD)
continue
- L.deal_damage(5, WHITE_DAMAGE)
+ L.deal_damage(5, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(3)
if(!particle_screech)
return
@@ -609,7 +609,7 @@
SLEEP_CHECK_DEATH(10)
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
if(H.health <= 0)
H.gib()
playsound(get_turf(src), 'ModularTegustation/Tegusounds/claw/prepare.ogg', 50, 0, 5)
@@ -638,7 +638,7 @@
for(var/turf/T in area_of_effect)
var/obj/effect/temp_visual/smash_effect/bloodeffect = new(T)
bloodeffect.color = "#b52e19"
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(H.sanity_lost)
H.gib()
playsound(get_turf(src), 'sound/abnormalities/apocalypse/slam.ogg', 50, 0, 5)
@@ -712,7 +712,7 @@
continue
if(faction_check_mob(L, FALSE))
continue
- L.deal_damage(20, BLACK_DAMAGE)
+ L.deal_damage(20, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(target == L)
continue
target_list += L
@@ -720,7 +720,7 @@
if(LAZYLEN(target_list))
target_list += target
for(var/mob/living/L in target_list)
- L.deal_damage(100, BLACK_DAMAGE) //You - you are probably going to die!
+ L.deal_damage(100, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL)) //You - you are probably going to die!
if(L.health < 0)
L.gib() //maybe someday we'll have a cool acid melting animation for this
@@ -776,7 +776,7 @@
var/total_damage = 30 //There will very rarely be over 2 people in the stack
var/new_damage = total_damage / (target_list.len)
for(var/mob/living/L in target_list)
- L.deal_damage(new_damage, PALE_DAMAGE)
+ L.deal_damage(new_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(L.health < 0)
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -784,7 +784,7 @@
else
L.gib()
else
- target.deal_damage(250, PALE_DAMAGE) //You - you are probably going to die!
+ target.deal_damage(250, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL)) //You - you are probably going to die!
if(target.health < 0)
target.dust()
can_act = TRUE
@@ -819,7 +819,7 @@
SLEEP_CHECK_DEATH(8)
for(var/turf/T in view(2, src))
new /obj/effect/temp_visual/nt_goodbye(T)
- for(var/mob/living/L in HurtInTurf(T, list(), 150, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), 150, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(L.health < 0)
L.gib()
playsound(get_turf(src), 'sound/abnormalities/nothingthere/goodbye_attack.ogg', 75, FALSE, 7)
@@ -854,7 +854,7 @@
if(TF.density)
continue
new /obj/effect/temp_visual/smash_effect(TF)
- been_hit = HurtInTurf(TF, been_hit, 40, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE)
+ been_hit = HurtInTurf(TF, been_hit, 40, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in been_hit)
if(L.health < 0)
L.gib()
@@ -948,9 +948,9 @@
/mob/living/simple_animal/hostile/abnormality/distortedform/proc/Finisher(mob/living/target)
to_chat(target, span_danger("[src] is trying to cut you in half!"))
if(!ishuman(target))
- target.deal_damage(150, PALE_DAMAGE) //bit more than usual DPS in pale damage
+ target.deal_damage(150, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //bit more than usual DPS in pale damage
return
- target.deal_damage(150, RED_DAMAGE) //You are probably going to die!
+ target.deal_damage(150, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //You are probably going to die!
if(target.health > 0)
return
var/mob/living/carbon/human/H = target
@@ -980,7 +980,7 @@
continue
if(!ishuman(L))
playsound(get_turf(L), 'sound/abnormalities/crumbling/attack.ogg', 50, FALSE)
- L.deal_damage(50, PALE_DAMAGE)
+ L.deal_damage(50, PALE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/slice(get_turf(L))
else
var/mob/living/carbon/human/H = L
@@ -1019,7 +1019,7 @@
++targetAmount
if(!ishuman(L))
new /obj/effect/temp_visual/beam_in(get_turf(L))
- L.deal_damage(60, PALE_DAMAGE)
+ L.deal_damage(60, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
else
@@ -1049,7 +1049,7 @@
/obj/effect/lightbolt/proc/explode()
playsound(get_turf(src), 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, FALSE, -3)
for(var/mob/living/carbon/human/H in view(1, src))
- H.deal_damage(boom_damage, PALE_DAMAGE)
+ H.deal_damage(boom_damage, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
if(H.health < 0)
H.dust()
new /obj/effect/temp_visual/beam_in(get_turf(src))
@@ -1099,7 +1099,7 @@
continue
if(faction_check_mob(L))
continue
- L.deal_damage(150, PALE_DAMAGE)
+ L.deal_damage(150, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.stat == DEAD)
for(var/i = 1 to 5) // Eventually turn this into a horizontal bisect. That would be cool.
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
@@ -1153,7 +1153,7 @@
forceMove(T)
for(var/turf/TF in view(1, T))
new /obj/effect/temp_visual/small_smoke/halfsecond(TF)
- var/list/new_hits = HurtInTurf(T, been_hit, 75, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(T, been_hit, 75, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
visible_message(span_boldwarning("[src] runs through [L]!"), span_nicegreen("You impaled heretic [L]!"))
@@ -1203,7 +1203,7 @@
if(TF.density)
continue
new /obj/effect/temp_visual/smash_effect(TF)
- been_hit = HurtInTurf(TF, been_hit, 35, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE)
+ been_hit = HurtInTurf(TF, been_hit, 35, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in been_hit)
if(L.health < 0)
if(!ishuman(L))
@@ -1263,7 +1263,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(20, BLACK_DAMAGE)
+ L.deal_damage(20, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.sanity_lost)
@@ -1288,7 +1288,7 @@
continue
if(faction_check_mob(L))
continue
- L.deal_damage(12, BLACK_DAMAGE)
+ L.deal_damage(12, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
if(!L.anchored)
var/whack_speed = (prob(60) ? 1 : 4)
@@ -1387,7 +1387,7 @@
continue
already_hit += L
var/truedamage = ishuman(L) ? 25 : 20 //less damage dealt to nonhumans
- L.deal_damage(truedamage, BLACK_DAMAGE)
+ L.deal_damage(truedamage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(1.71)
QDEL_NULL(current_beam)
SLEEP_CHECK_DEATH(1 SECONDS) //Rest after laser beam
@@ -1406,7 +1406,7 @@
for(var/turf/T in view(3, src))
var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(T)
FX.color = "#b52e19"
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 350, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 350, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(H.sanity_lost)
H.gib()
playsound(get_turf(src), 'sound/abnormalities/bloodbath/Bloodbath_EyeOn.ogg', 125, FALSE, 6)
@@ -1508,7 +1508,7 @@
H.Paralyze(20)
H.adjust_blindness(16)
to_chat(L, span_userdanger("MY EYES!!!"))
- H.apply_damage(30, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(30, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(H.sanity_lost) // They can't deal with being bald
H.dust()
if(!attack_chain)
@@ -1570,7 +1570,7 @@
if(!(faction_check in L.faction))
playsound(L.loc, 'sound/effects/burn.ogg', 50 - attack_range, TRUE, -1)
var/dealt_damage = max(5, 25 - (attack_range))
- L.deal_damage(dealt_damage, RED_DAMAGE)
+ L.deal_damage(dealt_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(ishuman(L) && dealt_damage > 25)
L.emote("scream")
to_chat(L, span_userdanger("IT BURNS!!"))
@@ -1600,7 +1600,7 @@
continue
if(faction_check_mob(L))
continue
- L.deal_damage((25 - get_dist(src, L)), WHITE_DAMAGE)
+ L.deal_damage((25 - get_dist(src, L)), WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
flash_color(L, flash_color = COLOR_BLUE_LIGHT, flash_time = 70)
if(!ishuman(L))
continue
@@ -1752,7 +1752,7 @@
for(var/mob/living/L in livinginview(8, src))
if(faction_check_mob(L))
continue
- L.deal_damage((100 - (5 * get_dist(src, L))), BLACK_DAMAGE)
+ L.deal_damage((100 - (5 * get_dist(src, L))), BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(2 SECONDS)
/mob/living/simple_animal/hostile/abnormality/distortedform/proc/ApocJudge()
@@ -1772,7 +1772,7 @@
if(L.stat == DEAD)
continue
new /obj/effect/temp_visual/judgement(get_turf(L))
- L.deal_damage(max(5, 60 - get_dist(src, L)), PALE_DAMAGE)
+ L.deal_damage(max(5, 60 - get_dist(src, L)), PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(1 SECONDS)
icon_state = "apocalypse"
SLEEP_CHECK_DEATH(1 SECONDS)
@@ -1837,7 +1837,7 @@
animate(D, alpha = 0, transform = matrix()*2, time = 5)
for(var/turf/T in view(1, src))
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 33, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 33, RED_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(H.health <= 0)
H.gib()
@@ -1857,7 +1857,7 @@
animate(D, alpha = 0, transform = matrix()*2, time = 5)
for(var/turf/T in view(4, src))
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, BLACK_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 50, BLACK_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(H.health <= 0)
H.gib()
@@ -1887,9 +1887,9 @@
continue
var/dist = get_dist(src, L)
if(ishuman(L)) //Different damage formulae for humans vs mobs
- L.deal_damage(clamp((4 * (2 ** (8 - dist))), 15, 4000), RED_DAMAGE) //4-1024 damage scaling exponentially with distance
+ L.deal_damage(clamp((4 * (2 ** (8 - dist))), 15, 4000), RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //4-1024 damage scaling exponentially with distance
else
- L.deal_damage(600 - ((dist > 2 ? dist : 0 )* 75), RED_DAMAGE) //0-600 damage scaling on distance, we don't want it oneshotting mobs
+ L.deal_damage(600 - ((dist > 2 ? dist : 0 )* 75), RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //0-600 damage scaling on distance, we don't want it oneshotting mobs
if(L.health < 0)
L.gib()
@@ -2086,4 +2086,4 @@
for(var/mob/living/L in T)
if(L == caster)
continue
- caster.HurtInTurf(T, list(), damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ caster.HurtInTurf(T, list(), damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm
index f41609c06a7b..c515952bde73 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/melting_love.dm
@@ -126,7 +126,7 @@
var/obj/effect/temp_visual/small_smoke/halfsecond/S = new(T)
S.color = "#FF0081"
var/list/got_hit = list()
- got_hit = HurtInTurf(T, got_hit, radius_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE)
+ got_hit = HurtInTurf(T, got_hit, radius_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, attack_type = (ATTACK_TYPE_MELEE))
for(var/mob/living/L in got_hit)
L.apply_status_effect(STATUS_EFFECT_SLIMED)
return ..()
@@ -218,7 +218,7 @@
/mob/living/simple_animal/hostile/abnormality/melting_love/proc/DissolveGifted(mob/living/carbon/C)
to_chat(C, span_userdanger("You feel like you are about to burst!"))
C.emote("scream")
- C.deal_damage(270, BLACK_DAMAGE)
+ C.deal_damage(270, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS))
C.remove_status_effect(STATUS_EFFECT_MELTYLOVE)
/mob/living/simple_animal/hostile/abnormality/melting_love/proc/UnregisterGiftedSignals(mob/living/carbon/human/user)
@@ -312,7 +312,7 @@
/mob/living/simple_animal/hostile/slime/proc/decay()
to_chat(src, span_userdanger("You feel yourself falling apart..."))
- src.deal_damage(decay_damage, BLACK_DAMAGE)
+ src.deal_damage(decay_damage, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
if (stat != DEAD)
addtimer(CALLBACK(src, PROC_REF(decay)), decay_timer SECONDS, TIMER_STOPPABLE)
@@ -324,7 +324,7 @@
new /obj/effect/decal/cleanable/melty_slime(R)
for(var/mob/living/L in view(death_slime_range, src))
if(L.stat != DEAD && !istype(L, /mob/living/simple_animal/hostile/slime))
- L.apply_damage(death_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(death_damage, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
return ..()
/mob/living/simple_animal/hostile/slime/CanAttack(atom/the_target)
@@ -539,7 +539,7 @@
if(!isliving(owner))
return
var/mob/living/L = owner
- L.deal_damage(5, BLACK_DAMAGE)
+ L.deal_damage(5, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
owner.playsound_local(owner, 'sound/effects/wounds/sizzle2.ogg', 25, TRUE)
if(!ishuman(L))
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm
index fe81068234ec..dd6137ac77ff 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/mountain.dm
@@ -278,7 +278,7 @@
playsound(get_turf(src), 'sound/abnormalities/mountain/scream.ogg', 75, 1, 5)
var/list/been_hit = list()
for(var/turf/T in view(7, src))
- HurtInTurf(T, been_hit, scream_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE)
+ HurtInTurf(T, been_hit, scream_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/mountain/proc/Slam(range)
if(slam_cooldown > world.time)
@@ -289,7 +289,7 @@
var/list/been_hit = list()
for(var/turf/open/T in view(2, src))
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
- HurtInTurf(T, been_hit, slam_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = FALSE, hurt_structure = TRUE, break_not_destroy = TRUE)
+ HurtInTurf(T, been_hit, slam_damage, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = FALSE, hurt_structure = TRUE, break_not_destroy = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/mountain/proc/Spit(atom/target)
if(spit_cooldown > world.time)
@@ -353,7 +353,7 @@
if(LAZYLEN(high_priority_turfs))
target_turf = get_closest_atom(/turf/open, high_priority_turfs, src)
if(phase <= 1)
- target = null
+ LoseTarget(FALSE)
else if(LAZYLEN(medium_priority_turfs))
target_turf = get_closest_atom(/turf/open, medium_priority_turfs, src)
else if(LAZYLEN(low_priority_turfs))
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm
index 94d7593549bd..86d3df7f5165 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/nihil.dm
@@ -143,17 +143,17 @@
playsound(src, 'sound/abnormalities/wrath_servant/hermit_magic.ogg', 60, FALSE, 10)
for(var/turf/T in range(1, src)) //First hit is just an AOE around nihil
new /obj/effect/temp_visual/eldritch_smoke(T)
- for(var/mob/living/L in HurtInTurf(T, list(), damage_dealt, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), damage_dealt, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
if(GirlCheck(L)) //EXTRA magical girl damage to kill them faster
- L.deal_damage((2 * damage_dealt), BRUTE)
+ L.deal_damage((2 * damage_dealt), BRUTE, src, attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(8)
playsound(src, 'sound/abnormalities/wrath_servant/hermit_attack_hard.ogg', 25, FALSE, 15, falloff_distance = 5)
new /obj/effect/temp_visual/voidout(myturf)
for(var/turf/T in range(1, myturf)) //Second hit is avoidable but deals 3x damage
- for(var/mob/living/L in HurtInTurf(T, list(), (3 * damage_dealt), BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), (3 * damage_dealt), BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
L.apply_void(3)
if(GirlCheck(L)) //EXTRA magical girl damage to kill them faster
- L.deal_damage((3 * damage_dealt), BRUTE)
+ L.deal_damage((3 * damage_dealt), BRUTE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/nihil/proc/NukeAttack(forced) //Phase-change attack with a long cooldown
if(nuke_cooldown > world.time && !forced)
@@ -187,11 +187,11 @@
continue
var/dist = get_dist(src, L)
var/damage_mod = (dist > 7 ? 5 : 20 )
- L.deal_damage(clamp((damage_mod * (25 - dist)), 15, nuke_damage), BLACK_DAMAGE) //Between 500 and 15 damage, scaling down heavily past a distance of 7 tiles
+ L.deal_damage(clamp((damage_mod * (25 - dist)), 15, nuke_damage), BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL)) //Between 500 and 15 damage, scaling down heavily past a distance of 7 tiles
flash_color(L, flash_color = COLOR_ALMOST_BLACK, flash_time = 70)
L.apply_void(damage_mod / 5) //inflict a void debuff
if(GirlCheck(L)) //This should kill them most of the time if they are too close
- L.deal_damage((100 * damage_mod), BRUTE)
+ L.deal_damage((100 * damage_mod), BRUTE, src, attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(3)
animate(src, transform = init_transform, time = 5)
addtimer(CALLBACK(src, PROC_REF(NukeAttack)), 5 MINUTES)
@@ -268,7 +268,7 @@
playsound(src, 'sound/weapons/fixer/generic/dodge.ogg', 75, FALSE, 10)
for(var/turf/T in view(2, src))
new /obj/effect/temp_visual/small_smoke(T)
- for(var/mob/living/H in HurtInTurf(T, list(), (0.5 * explode_damage), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/H in HurtInTurf(T, list(), (0.5 * explode_damage), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
visible_message("[src] tosses [H] out of the way!")
var/rand_dir = pick(NORTH, SOUTH, EAST, WEST)
var/atom/throw_target = get_edge_target_turf(H, rand_dir)
@@ -289,7 +289,7 @@
target_list += L
for(var/i = 1 to 10)
if(LAZYLEN(target_list))
- target = pick(target_list)
+ FindTarget(list(pick(target_list)), TRUE)
if(!target)
return
var/turf/T = get_step(get_turf(src), pick(1,2,4,5,6,8,9,10))
@@ -318,7 +318,7 @@
if("WRATH")
playsound(src, 'sound/abnormalities/wrath_servant/big_smash3.ogg', 75, FALSE, 10, falloff_distance = 5)
for(var/turf/T in view(2, src))
- HurtInTurf(T, list(), explode_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), explode_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/kinetic_blast(T)
if(prob(95))
new /obj/effect/decal/cleanable/wrath_acid/bad(T)
@@ -336,7 +336,7 @@
playsound(src, 'sound/abnormalities/kog/GreedHit1.ogg', 75, FALSE, 10)
for(var/turf/T in view(3, src))
new /obj/effect/temp_visual/small_smoke(T)
- for(var/mob/living/H in HurtInTurf(T, list(), (2 * explode_damage), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/H in HurtInTurf(T, list(), (2 * explode_damage), RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
visible_message("[src] tosses [H] out of the way!")
var/rand_dir = pick(NORTH, SOUTH, EAST, WEST)
var/atom/throw_target = get_edge_target_turf(H, rand_dir)
@@ -352,7 +352,7 @@
VO.transform = new_matrix
playsound(src, 'sound/effects/phasein.ogg', 65, FALSE, 10)
for(var/turf/open/T in view(2, src))
- HurtInTurf(T, list(), explode_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), explode_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
if("DESPAIR")
SLEEP_CHECK_DEATH(4)
TeleportOut()//Same effect but with a delay
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm
index ddf798cd6f4e..c72f356e419c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/nobody_is.dm
@@ -288,12 +288,12 @@
ChangeMoveToDelayBy(1.5)
current_stage = clamp(current_stage + 1, 1, 3)
-/mob/living/simple_animal/hostile/abnormality/nobody_is/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/abnormality/nobody_is/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- if(damagetype == BLACK_DAMAGE || damage < 10)
+ if(. < 10)
return
if(grab_victim)
- release_damage = clamp(release_damage + damage, 0, release_threshold)
+ release_damage = clamp(release_damage + ., 0, release_threshold)
if(release_damage >= release_threshold)
ReleaseGrab()
if(!oberon_mode)
@@ -500,9 +500,9 @@
SLEEP_CHECK_DEATH(grab_windup_time)
for(var/turf/T in view(3, src))
new /obj/effect/temp_visual/nobody_grab(T)
- for(var/mob/living/L in HurtInTurf(T, list(), grab_damage, BLACK_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), grab_damage, BLACK_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(oberon_mode)
- HurtInTurf(T, list(), grab_damage_oberon, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE)
+ HurtInTurf(T, list(), grab_damage_oberon, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.sanity_lost)
@@ -524,7 +524,7 @@
grab_victim = H
Strangle()
else //deal the damage twice if we already have someone grabbed
- L.deal_damage(grab_damage, BLACK_DAMAGE)
+ L.deal_damage(grab_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/abnormalities/fairy_longlegs/attack.ogg', 75, 0, 3)
SLEEP_CHECK_DEATH(3)
@@ -561,9 +561,9 @@
grab_victim.gib()
ReleaseGrab()
return
- grab_victim.deal_damage(strangle_damage, BLACK_DAMAGE)
+ grab_victim.deal_damage(strangle_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(oberon_mode)
- grab_victim.deal_damage(strangle_damage_oberon, WHITE_DAMAGE)
+ grab_victim.deal_damage(strangle_damage_oberon, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
grab_victim.Immobilize(10)
playsound(get_turf(src), 'sound/abnormalities/nothingthere/hello_bam.ogg', 50, 0, 7)
playsound(get_turf(src), 'sound/abnormalities/nobodyis/strangle.ogg', 100, 0, 7)
@@ -577,10 +577,10 @@
if(4) //Apply double damage
playsound(get_turf(src), 'sound/effects/wounds/crackandbleed.ogg', 200, 0, 7)
to_chat(grab_victim, span_userdanger("It hurts so much!"))
- grab_victim.deal_damage(strangle_damage, BLACK_DAMAGE)
+ grab_victim.deal_damage(strangle_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
else //Apply ramping damage
playsound(get_turf(src), 'sound/effects/wounds/crackandbleed.ogg', 200, 0, 7)
- grab_victim.deal_damage((strangle_damage * (count - 3)), BLACK_DAMAGE)
+ grab_victim.deal_damage((strangle_damage * (count - 3)), BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
count += 1
if(grab_victim.sanity_lost) //This should prevent weird things like panics running away halfway through
grab_victim.Stun(10) //Immobilize does not stop AI controllers from moving, for some reason.
@@ -627,7 +627,7 @@
if(oberon_mode)
if(isliving(attacked_target))
var/mob/living/L = attacked_target
- L.deal_damage(melee_damage_oberon, WHITE_DAMAGE)
+ L.deal_damage(melee_damage_oberon, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.sanity_lost)
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm
index b8b72acdfa7c..830c98e8ccd1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/nothing_there.dm
@@ -261,9 +261,9 @@
heard_words[speaker] += raw_message
listen_chance = initial(listen_chance)
-/mob/living/simple_animal/hostile/abnormality/nothing_there/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/abnormality/nothing_there/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- if(damagetype == RED_DAMAGE || damage < 10)
+ if(. < 10)
return
last_heal_time = world.time + 10 SECONDS // Heal delayed when taking damage; Doubled because it was a little too quick.
@@ -356,7 +356,7 @@
if(TF.density)
continue
new /obj/effect/temp_visual/smash_effect(TF)
- been_hit = HurtInTurf(TF, been_hit, hello_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE)
+ been_hit = HurtInTurf(TF, been_hit, hello_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in been_hit)
if(L.health < 0)
L.gib()
@@ -375,7 +375,7 @@
SLEEP_CHECK_DEATH(8)
for(var/turf/T in view(2, src))
new /obj/effect/temp_visual/nt_goodbye(T)
- for(var/mob/living/L in HurtInTurf(T, list(), goodbye_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), goodbye_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(L.health < 0)
L.gib()
playsound(get_turf(src), 'sound/abnormalities/nothingthere/goodbye_attack.ogg', 75, 0, 7)
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm
index 6c68cdcc2a44..f5eee8ae2b02 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/seasons.dm
@@ -478,7 +478,8 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(pulse_damage, melee_damage_type)
+ L.deal_damage(pulse_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_SPECIAL))
+
/mob/living/simple_animal/hostile/abnormality/seasons/proc/Finisher(mob/living/carbon/human/H) //return TRUE to prevent attacking, as attacking causes runtimes if the target is gibbed.
if(current_season == "spring" && H.sanity_lost) // we check for sanity, and kill em
@@ -586,7 +587,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(melee_damage_upper * 2, melee_damage_type)
+ L.deal_damage(melee_damage_upper * 2, melee_damage_type, src, attack_type = (ATTACK_TYPE_MELEE))
been_hit = TRUE
if(been_hit)
new /mob/living/simple_animal/hostile/flytrap(T)
@@ -614,7 +615,7 @@
continue
var/obj/structure/thorn_bomb/thebomb = new(get_turf(L))
plants += thebomb
- L.deal_damage(slam_damage, melee_damage_type)
+ L.deal_damage(slam_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(ishuman(L))
Finisher(L)
SLEEP_CHECK_DEATH(3)
@@ -660,7 +661,7 @@
if(L in hit_list || istype(L, type))
continue
hit_list += L
- L.deal_damage(special_attack_damage, melee_damage_type)
+ L.deal_damage(special_attack_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
new /mob/living/simple_animal/hostile/flytrap(T)
if(ishuman(L))
Finisher(L)
@@ -706,8 +707,8 @@
playsound(T, 'sound/weapons/fixer/generic/fire3.ogg', 30, TRUE, 3)
new /obj/effect/temp_visual/smash_effect(T)
new /obj/effect/temp_visual/fire/fast(T)
- been_hit = HurtInTurf(T, been_hit, (melee_damage_upper * 0.5), FIRE, check_faction = TRUE)
- been_hit = HurtInTurf(T, been_hit, melee_damage_upper, RED_DAMAGE, check_faction = TRUE)
+ been_hit = HurtInTurf(T, been_hit, (melee_damage_upper * 0.5), FIRE, check_faction = TRUE, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_RANGED))
+ been_hit = HurtInTurf(T, been_hit, melee_damage_upper, RED_DAMAGE, check_faction = TRUE, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_RANGED))
TryCreateSeasonTurf(T)
can_act = TRUE
@@ -729,7 +730,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(slam_damage, melee_damage_type)
+ L.deal_damage(slam_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(ishuman(L))
Finisher(L)
for(var/turf/T in view(7, src))
@@ -778,7 +779,7 @@
playsound(src,'ModularTegustation/Tegusounds/claw/move.ogg', 50, 1)
for(var/turf/T2 in view(1,src))
new /obj/effect/temp_visual/small_smoke/halfsecond(T2)
- var/list/new_hits = HurtInTurf(T2, special_hit_list, special_attack_damage * 2.5, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE) - special_hit_list
+ var/list/new_hits = HurtInTurf(T2, special_hit_list, special_attack_damage * 2.5, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_MELEE)) - special_hit_list
special_hit_list += new_hits
for(var/mob/living/carbon/L in new_hits)
L.throw_at(get_edge_target_turf(L, dir), 5, 2, gentle = TRUE)
@@ -799,7 +800,7 @@
R.boom_damage = slam_damage
for(var/turf/T in view(3,src))
new /obj/effect/temp_visual/fire/fast(T)
- for(var/mob/living/carbon/L in HurtInTurf(T, list(), special_attack_damage * 1.75, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/carbon/L in HurtInTurf(T, list(), special_attack_damage * 1.75, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_MELEE)))
var/atom/throw_target = get_edge_target_turf(L, get_dir(L, get_step_away(L, get_turf(src))))
L.throw_at(throw_target, 5, 2, gentle = TRUE)
@@ -812,7 +813,7 @@
var/bomb_damage = melee_damage_upper * 1.5
var/turf/target_turf
playsound(attacked_target, 'sound/abnormalities/seasons/old_fall_attack.ogg', 90, FALSE, 10)
- attacked_target.deal_damage(damage_dealt * 0.5, BLACK_DAMAGE)
+ attacked_target.deal_damage(damage_dealt * 0.5, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE))
attacked_target.apply_dark_flame(1)
target_turf = get_turf(attacked_target)
new /obj/effect/temp_visual/seasons_wisp_death(target_turf)
@@ -828,7 +829,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(bomb_damage, BLACK_DAMAGE)
+ L.deal_damage(bomb_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_RANGED))
if(ishuman(L))
Finisher(L)
L.apply_dark_flame(8)
@@ -851,7 +852,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(slam_damage, melee_damage_type)
+ L.deal_damage(slam_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_MELEE))
if(ishuman(L))
Finisher(L)
L.apply_dark_flame(10)
@@ -960,7 +961,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(slam_damage, melee_damage_type)
+ L.deal_damage(slam_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_MELEE))
if(ishuman(L))
Finisher(L)
for(var/mob/living/T in view(9, src))
@@ -1091,7 +1092,7 @@
rotted = TRUE
break
if(!rotted)
- L.deal_damage(1, TOX)
+ L.deal_damage(1, TOX, attack_type = (ATTACK_TYPE_ENVIRONMENT))
var/obj/effect/temp_visual/alriune_attack/vfx = new(get_turf(L))
vfx.color = COLOR_VERY_DARK_LIME_GREEN
to_chat(L, span_warning("A mysterious force rapidly decays you!"))
@@ -1265,11 +1266,11 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(current_season == "summer")
- H.deal_damage(2, FIRE)
+ H.deal_damage(2, FIRE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
H.apply_lc_burn(3)
dealt_damage = TRUE
else if(current_season == "spring")
- H.apply_damage(4, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE), spread_damage = FALSE)
+ H.deal_damage(4, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(!dealt_damage)
damaging = FALSE
return
@@ -1456,7 +1457,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(bomb_damage, BLACK_DAMAGE)
+ L.deal_damage(bomb_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
L.apply_dark_flame(10)
/mob/living/simple_animal/hostile/willowisp/death()
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm
index f2f8288a808f..6dab76479b9e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/silent_orchestra.dm
@@ -83,7 +83,7 @@
if(faction_check_mob(L))
continue
var/dealt_damage = max(6, symphony_damage - round(get_dist(src, L) * 0.1))
- L.deal_damage(dealt_damage, WHITE_DAMAGE)
+ L.deal_damage(dealt_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE))
if(world.time >= next_movement_time) // Next movement
var/movement_volume = 50
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm
index b3be0bb4cfbe..1212f49b9957 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/space_lady.dm
@@ -118,12 +118,12 @@
continue
new /obj/effect/temp_visual/revenant(T)
for(var/mob/living/carbon/human/L in T)
- L.deal_damage(explosion_damage, BLACK_DAMAGE)
+ L.deal_damage(explosion_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(10) //I kinda want it to be a bit of a delay but not too much
//White Hole effect
for(var/mob/living/carbon/human/L in view(14, src))
- L.deal_damage(explosion_damage, WHITE_DAMAGE)
+ L.deal_damage(explosion_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
goonchem_vortex(get_turf(src), 1, 13)
can_act = TRUE
Teleport()
@@ -152,7 +152,7 @@
been_hit += L
if(L.sanity_lost) //DIE FOOL. LADY BLAST
L.dust()
- L.deal_damage(negative_damage, WHITE_DAMAGE)
+ L.deal_damage(negative_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
all_turfs -= T
negative_damage += negative_damage_scale//Every tile it traves it does 10 more damage up to 120
SLEEP_CHECK_DEATH(3)
@@ -280,7 +280,7 @@
continue
new /obj/effect/temp_visual/revenant(T)
for(var/mob/living/carbon/human/L in T)
- L.deal_damage(30, WHITE_DAMAGE)
+ L.deal_damage(30, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/obj/projectile/black_hole
@@ -299,7 +299,7 @@
continue
new /obj/effect/temp_visual/revenant(T)
for(var/mob/living/carbon/human/L in T)
- L.deal_damage(30, BLACK_DAMAGE)
+ L.deal_damage(30, BLACK_DAMAGE, source = firer, attack_type = (ATTACK_TYPE_SPECIAL | ATTACK_TYPE_RANGED))
/obj/projectile/loos_bullet
name = "white beam"
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm
index df7d985911c6..82592aa692aa 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/titania.dm
@@ -216,7 +216,7 @@
/mob/living/simple_animal/hostile/abnormality/titania/proc/Punishment(mob/living/sinner)
to_chat(sinner, span_userdanger("You are hurt due to breaking Fairy Law."))
- sinner.deal_damage(law_damage, PALE_DAMAGE)
+ sinner.deal_damage(law_damage, PALE_DAMAGE, src, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(sinner), pick(GLOB.alldirs))
//Ranged stuff
diff --git a/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm b/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm
index 3c1d0aee28ff..063ae6eb8ad9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/aleph/white_night.dm
@@ -171,7 +171,7 @@ GLOBAL_LIST_EMPTY(apostles)
playsound(L.loc, 'sound/machines/clockcult/ark_damage.ogg', 50 - attack_range, TRUE, -1)
// The farther you are from white night - the less damage it deals
var/dealt_damage = max(5, holy_revival_damage - attack_range)
- L.deal_damage(dealt_damage, PALE_DAMAGE)
+ L.deal_damage(dealt_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(ishuman(L) && dealt_damage > 25)
L.emote("scream")
to_chat(L, span_userdanger("The holy light... IT BURNS!!"))
@@ -376,7 +376,7 @@ GLOBAL_LIST_EMPTY(apostles)
SLEEP_CHECK_DEATH(10)
for(var/turf/T in view(scythe_range, src))
new /obj/effect/temp_visual/smash_effect(T)
- HurtInTurf(T, list(), scythe_damage, scythe_damage_type, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE)
+ HurtInTurf(T, list(), scythe_damage, scythe_damage_type, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/abnormalities/whitenight/scythe_spell.ogg', 75, FALSE, 5)
SLEEP_CHECK_DEATH(5)
can_act = TRUE
@@ -426,7 +426,7 @@ GLOBAL_LIST_EMPTY(apostles)
continue
if(faction_check_mob(L))
continue
- L.deal_damage(scythe_damage, scythe_damage_type)
+ L.deal_damage(scythe_damage, scythe_damage_type, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.stat == DEAD) // Total overkill
for(var/i = 1 to 5) // Alternative to gib()
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
@@ -507,7 +507,7 @@ GLOBAL_LIST_EMPTY(apostles)
forceMove(T)
for(var/turf/TF in view(1, T))
new /obj/effect/temp_visual/small_smoke/halfsecond(TF)
- var/list/new_hits = HurtInTurf(T, been_hit, spear_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(T, been_hit, spear_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
visible_message(span_boldwarning("[src] runs through [L]!"), span_nicegreen("You impaled heretic [L]!"))
@@ -599,7 +599,7 @@ GLOBAL_LIST_EMPTY(apostles)
for(var/mob/living/L in AT)
if(faction_check_mob(L))
continue
- L.deal_damage(staff_damage, WHITE_DAMAGE)
+ L.deal_damage(staff_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.sanity_lost)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm b/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
index 9f148b606240..5e7e0ffae319 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/KQE.dm
@@ -236,7 +236,7 @@
SLEEP_CHECK_DEATH(10)
for(var/turf/T in view(2, src))
new /obj/effect/temp_visual/smash_effect(T)
- HurtInTurf(T, list(), melee_damage_upper, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE)
+ HurtInTurf(T, list(), melee_damage_upper, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
icon_state = "kqe_prepare2"
SLEEP_CHECK_DEATH(3)
icon_state = icon_living
@@ -300,7 +300,7 @@
M.ejectall()
for(var/mob/living/carbon/human/H in view(1, src))
grabbed = TRUE
- H.deal_damage(boom_damage, BLACK_DAMAGE)
+ H.deal_damage(boom_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
H.forceMove(get_turf(src))//pulls them all to the target
GrabStun(H)
if(grabbed)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm b/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm
index 04886f35fd57..ccf0e060b9e9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/basilisoup.dm
@@ -255,14 +255,14 @@
forceMove(T)
for(var/turf/U in range(1, T))
- var/list/new_hits = HurtInTurf(U, been_hit, 0, BLACK_DAMAGE, hurt_mechs = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(U, been_hit, 0, BLACK_DAMAGE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
var/atom/throw_target = get_edge_target_turf(L, get_dir(L, get_step_away(L, get_turf(src))))
L.visible_message(span_boldwarning("[src] slams into [L]!"), span_userdanger("[src] rends you with its teeth and claws!"))
playsound(L, 'sound/weapons/genhit2.ogg', 75, 1)
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
- L.deal_damage(charge_damage, BLACK_DAMAGE)
+ L.deal_damage(charge_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
L.throw_at(throw_target, 3, 2)
for(var/obj/vehicle/V in new_hits)
V.take_damage(charge_damage, BLACK_DAMAGE, attack_sound)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm b/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm
index 8788b28a029a..6a154ae5addc 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/better_memories.dm
@@ -280,10 +280,8 @@
var/secondarmor = run_armor_check(null, P.damage_type, "","",P.armour_penetration)
var/second_on_hit_state = P.on_hit(src, secondarmor)
if(!P.nodamage && second_on_hit_state != BULLET_ACT_BLOCK)
- apply_damage(P.damage, P.damage_type, null, secondarmor)
+ deal_damage(P.damage, P.damage_type, source = P.firer, attack_type = (ATTACK_TYPE_RANGED), blocked = secondarmor)
apply_effects(P.stun, P.knockdown, P.unconscious, P.irradiate, P.slur, P.stutter, P.eyeblur, P.drowsy, secondarmor, P.stamina, P.jitter, P.paralyze, P.immobilize)
- if(P.firer)
- RegisterAggroValue(P.firer, P.damage, P.damage_type)
//If the projectile had no firer then just list it as nobuddy
if(!P.firer)
if(target_memory["nobuddy"] > 100)
@@ -360,7 +358,7 @@
TemporarySpeedChange(-1, 1.5 SECONDS)
fleeing_now = TRUE
target_memory.Cut()
- target = null
+ LoseTarget(FALSE)
//Eh whatever make them not instantly patrol again upon reaching their destination.
patrol_cooldown = world.time + patrol_cooldown_time
if(patrol_to(FleeDest()))
@@ -552,7 +550,7 @@
var/mob/living/carbon/human/L = owner
if(L.sanity_lost || L.stat == DEAD)
qdel(src)
- L.deal_damage(2, WHITE_DAMAGE)
+ L.deal_damage(2, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
//Unsure if these statements explain what is happening to your character but its enough. -IP
to_chat(owner, pick(
span_warning("You have trouble recalling your life before this job."),
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm b/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm
index 10d933b589e4..7f3c4aff4f01 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/blue_shepherd.dm
@@ -124,6 +124,8 @@
var/no_counter = FALSE
var/sidesteping = FALSE
var/countering = FALSE
+ /// This one keeps track of whether we've already counterattacked during our parry. This is so we can block multiple instances of damage during our parry, but only riposte once.
+ var/riposted = FALSE
var/counter_damage = 5
//PLAYABLES ATTACKS
attack_action_types = list(/datum/action/innate/abnormality_attack/toggle/sheperd_spin_toggle, /datum/action/cooldown/evade, /datum/action/cooldown/parry)
@@ -214,27 +216,26 @@
if (istype(owner, /mob/living/simple_animal/hostile/abnormality/blue_shepherd))
var/mob/living/simple_animal/hostile/abnormality/blue_shepherd/H = owner
if(H.no_counter)
- to_chat(H, "You are curretnly dodging!")
+ to_chat(H, "You are currently dodging!")
return FALSE
else
- H.ChangeResistances(list(RED_DAMAGE = 0, WHITE_DAMAGE = 0, BLACK_DAMAGE = 0, PALE_DAMAGE = 0))
H.countering = TRUE
H.slashing = TRUE
+ H.riposted = FALSE
H.manual_emote("raises their blade...")
H.color = "#26a2d4"
playsound(H, 'sound/items/unsheath.ogg', 75, FALSE, 4)
addtimer(CALLBACK(src, PROC_REF(endcounter)), counter_duration)
StartCooldown()
-/mob/living/simple_animal/hostile/abnormality/blue_shepherd/attacked_by(obj/item/I, mob/living/user)
+/mob/living/simple_animal/hostile/abnormality/blue_shepherd/PreDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- if (countering)
- counter()
-
-/mob/living/simple_animal/hostile/abnormality/blue_shepherd/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE)
- . = ..()
- if (countering)
- counter()
+ if((!countering) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS))) // We don't parry these types of attacks.
+ return
+ if(!riposted)
+ riposted = TRUE
+ INVOKE_ASYNC(src, PROC_REF(counter))
+ return FALSE // Damage of the types not checked in the first conditional is prevented on us for as long as 'countering' is true.
/mob/living/simple_animal/hostile/abnormality/blue_shepherd/proc/counter()
var/list/been_hit = list()
@@ -242,10 +243,9 @@
playsound(src, 'sound/weapons/fixer/generic/finisher2.ogg', 75, TRUE, 2)
for(var/turf/T in range(2, src))
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, counter_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15)
+ been_hit = HurtInTurf(T, been_hit, counter_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_COUNTER))
for(var/mob/living/carbon/human/H in T)
H.Knockdown(20)
- countering = FALSE
/datum/action/cooldown/parry/proc/endcounter()
if (istype(owner, /mob/living/simple_animal/hostile/abnormality/blue_shepherd))
@@ -253,7 +253,6 @@
H.countering = FALSE
H.slashing = FALSE
H.color = null
- H.ChangeResistances(list(RED_DAMAGE = 0.6, WHITE_DAMAGE = 1, BLACK_DAMAGE = 0.8, PALE_DAMAGE = 1.5))
/datum/action/innate/abnormality_attack/toggle/sheperd_spin_toggle
name = "Toggle Spinning Slash"
@@ -438,7 +437,7 @@
if(stat == DEAD)
return
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/L in HurtInTurf(T, list(), slash_damage, BLACK_DAMAGE, check_faction = combat_map, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), slash_damage, BLACK_DAMAGE, check_faction = combat_map, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(L == awakened_buddy && !buddy_hit)
buddy_hit = TRUE //sometimes buddy get hit twice so we check if it got hit in this slash
awakened_buddy.adjustHealth(700) //it would take approximatively 9 slashes to take buddy down
@@ -450,7 +449,7 @@
current_red.WatchIt()
all_turfs -= T
continue // Red doesn't get hit.
- L.deal_damage(slash_damage, BLACK_DAMAGE)
+ L.deal_damage(slash_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
all_turfs -= T
if(slash_count >= range)
buddy_hit = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm b/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm
index 7bb68dd9e6de..fbfcb6119f5e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/doomsday_calendar.dm
@@ -169,7 +169,7 @@
/mob/living/simple_animal/hostile/abnormality/doomsday_calendar/Worktick(mob/living/carbon/human/user)
if(bonusRed) // If you have bonus red damage to apply...
- user.deal_damage(bonusRed, RED_DAMAGE)
+ user.deal_damage(bonusRed, RED_DAMAGE, flags = (DAMAGE_FORCED))
return ..()
/mob/living/simple_animal/hostile/abnormality/doomsday_calendar/OnQliphothChange(mob/living/carbon/human/user)//woodsman icon change
@@ -266,7 +266,7 @@
A.datum_reference.qliphoth_change(-1)
if(faction_check_mob(H))
continue
- H.deal_damage(aflame_damage, BLACK_DAMAGE)
+ H.deal_damage(aflame_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(H.stat >= SOFT_CRIT || H.health < 0)
H.fire_stacks += 1
H.IgniteMob()//unforunately this fire isn' blue.
@@ -277,7 +277,7 @@
for(var/mob/living/L in livinginview(10, src))
if(faction_check_mob(L))
continue
- L.deal_damage(pulse_damage, RED_DAMAGE)
+ L.deal_damage(pulse_damage, RED_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/doomsday_calendar/proc/EnableFire()
if(current_phase_num <= 1)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm b/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm
index 5e6b1ac166ce..552912d9bb9a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/drifting_fox.dm
@@ -197,7 +197,7 @@
/mob/living/simple_animal/hostile/umbrella/death(gibbed)
visible_message(span_notice("[src] falls to the ground as the umbrella closes in on itself!"))
if(friend)
- friend.deal_damage(50, BLACK_DAMAGE)
+ friend.deal_damage(50, BLACK_DAMAGE, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_SPECIAL))
friend.move_to_delay = clamp(move_to_delay + 1, 3, 7) //Slowdown
animate(src, alpha = 0, time = 10 SECONDS)
QDEL_IN(src, 10 SECONDS)
@@ -236,7 +236,7 @@
SLEEP_CHECK_DEATH(6)
for(var/turf/T in view(1, target_turf))
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 5, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 5, BLACK_DAMAGE, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
H.apply_status_effect(STATUS_EFFECT_FALSEKIND)
playsound(target_turf, 'sound/abnormalities/drifting_fox/fox_umbrella.ogg', 25, TRUE, 4)
ranged_cooldown = world.time + ranged_cooldown_time
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/eris.dm b/code/modules/mob/living/simple_animal/abnormality/he/eris.dm
index 4c6e469d6e05..8871536e9535 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/eris.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/eris.dm
@@ -148,7 +148,7 @@
//Lose sanity
for(var/mob/living/carbon/human/H in view(10, get_turf(src)))
- H.deal_damage(girlboss_level*10, WHITE_DAMAGE)
+ H.deal_damage(girlboss_level*10, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(10)
manual_emote("wipes her mouth with a hankerchief")
@@ -195,26 +195,18 @@
for(var/mob/living/H in view(10, get_turf(src)))
if(H.stat >= SOFT_CRIT)
continue
- //Shamelessly fucking stolen from risk of rain's teddy bear.
+ //Shamelessly fucking stolen from risk of rain's teddy bear. Maxes out at 2.
var/healamount = 2 * (TOUGHER_TIMES(girlboss_level))
H.adjustBruteLoss(-healamount) //Healing for those around.
new /obj/effect/temp_visual/heal(get_turf(H), "#FF4444")
//Okay but here's the defensive options
-/mob/living/simple_animal/hostile/abnormality/eris/bullet_act(obj/projectile/Proj)
- ..()
- if(!ishuman(Proj.firer))
- return
- var/mob/living/carbon/human/H = Proj.firer
- H.deal_damage(3*(TOUGHER_TIMES(girlboss_level)), WHITE_DAMAGE)
-
-
-/mob/living/simple_animal/hostile/abnormality/eris/attacked_by(obj/item/I, mob/living/user)
- ..()
- if(!user)
+/mob/living/simple_animal/hostile/abnormality/eris/PostDamageReaction(damage_amount, damage_type, source, attack_type)
+ . = ..()
+ if(. <= 0 || !isliving(source) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
return
- user.deal_damage(3*(TOUGHER_TIMES(girlboss_level)), WHITE_DAMAGE)
-
+ var/mob/living/okay_but_heres_the_victim = source
+ okay_but_heres_the_victim.deal_damage(3*(TOUGHER_TIMES(girlboss_level)), WHITE_DAMAGE, source = src, attack_type = (ATTACK_TYPE_COUNTER))
//Okay, but here's the work effects
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/fan.dm b/code/modules/mob/living/simple_animal/abnormality/he/fan.dm
index 9ca96d779d8e..df95d0828c4a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/fan.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/fan.dm
@@ -185,7 +185,7 @@
return
if(stacks < 10)
return
- owner.deal_damage((stacks / 10), FIRE)
+ owner.deal_damage((stacks / 10), FIRE, attack_type = ATTACK_TYPE_STATUS)
owner.playsound_local(owner, 'sound/effects/burn.ogg', 25, TRUE)
/datum/status_effect/stacking/fanhot/on_remove()
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm b/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm
index 844a2fa8fef9..fd04a2db8f02 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/funeral.dm
@@ -137,7 +137,7 @@
for(var/turf/T in line_of_sight)
if(DensityCheck(T))
return
- cooler_target.deal_damage(gun_damage, WHITE_DAMAGE)
+ cooler_target.deal_damage(gun_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
visible_message(span_danger("[cooler_target] is hit by butterflies!"))
//No longer because fuck you.
if(ishuman(target))
@@ -242,14 +242,14 @@
/mob/living/simple_animal/hostile/abnormality/funeral/proc/SwarmTurfLinger(turf/T)
for(var/i = 1 to 40) //40 times
if(SSmaptype.maptype == "limbus_labs")
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), swarm_damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), swarm_damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL)))
if(H.stat == DEAD)
continue
if(H.sanity_lost)
H.death()
KillAnimation(H)
else
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), swarm_damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), swarm_damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL)))
if(H.stat == DEAD)
continue
if(H.sanity_lost)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm b/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm
index 86bc4a5ca452..c33b4ee4d17e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/galaxy_child.dm
@@ -137,7 +137,7 @@
/mob/living/simple_animal/hostile/abnormality/galaxy_child/proc/break_gifts()
for(var/mob/living/carbon/human/friend as anything in galaxy_friends)
- friend.deal_damage(damage_amount, BLACK_DAMAGE)
+ friend.deal_damage(damage_amount, BLACK_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS))
friend.remove_status_effect(STATUS_EFFECT_FRIENDSHIP)
UnregisterSignal(friend, COMSIG_LIVING_DEATH)
UnregisterSignal(friend, COMSIG_PARENT_QDELETING)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm b/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm
index 9d0e8d5676b2..73b500edfa9a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/golden_false_apple.dm
@@ -335,7 +335,7 @@
playsound(get_turf(src), 'sound/abnormalities/goldenapple/False_Attack2.ogg', 100, 0, 5)
for(var/turf/T in view(1, src))
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/carbon/L in HurtInTurf(T, list(), 200, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/carbon/L in HurtInTurf(T, list(), 200, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(L.stat >= SOFT_CRIT)
if(!last_target)//only the last person killed counts
L.forceMove(src)
@@ -425,7 +425,7 @@
dir = dir_to_target
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/L in HurtInTurf(T, list(), smash_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), smash_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
var/datum/status_effect/stacking/maggots/G = L.has_status_effect(/datum/status_effect/stacking/maggots)
if(!G)
L.apply_status_effect(STATUS_EFFECT_MAGGOTS)
@@ -506,7 +506,7 @@
/datum/status_effect/stacking/maggots/tick()//change this to golden apple's life tick for less lag
var/mob/living/carbon/human/status_holder = owner
- status_holder.deal_damage(stacks, BLACK_DAMAGE)
+ status_holder.deal_damage(stacks, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(status_holder.stat < HARD_CRIT)
return
var/obj/structure/spider/cocoon/casing = new(status_holder.loc)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm b/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm
index d5427998b2cd..aaed54416539 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/headless_ichthys.dm
@@ -116,7 +116,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(jump_damage, BLACK_DAMAGE)
+ L.deal_damage(jump_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
for(var/obj/vehicle/sealed/mecha/V in T)
@@ -176,7 +176,7 @@
continue
already_hit += L
var/truedamage = ishuman(L) ? beam_damage : beam_damage/2 //half damage dealt to nonhumans
- L.deal_damage(truedamage, BLACK_DAMAGE)
+ L.deal_damage(truedamage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/obj/vehicle/sealed/mecha/V in turfs_to_check)
if(V in already_hit)
continue
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/helper.dm b/code/modules/mob/living/simple_animal/abnormality/he/helper.dm
index fd52117968bd..3c5d4c89eb01 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/helper.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/helper.dm
@@ -240,7 +240,7 @@
new /obj/effect/temp_visual/kinetic_blast(LT)
if(!ishuman(L))
dash_damage = dash_damage * 2
- L.deal_damage(dash_damage, melee_damage_type)
+ L.deal_damage(dash_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(IsCombatMap())
L.apply_lc_bleed(5)
if(!ishuman(L))
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm b/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm
index 19a634ed0e61..1aa5d0cac9a6 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/laetitia.dm
@@ -137,10 +137,10 @@
playsound(get_turf(src), 'sound/abnormalities/laetitia/spider_born.ogg', 50, 1)
if (istype(user, /mob/living))
var/mob/living/L = user
- L.apply_damage((basepower*strength), RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), FALSE, TRUE)
+ L.deal_damage((basepower*strength), RED_DAMAGE, flags = (DAMAGE_FORCED))
for(var/turf/T in range(2, user))
new /obj/effect/temp_visual/smash_effect(T)
- user.HurtInTurf(T, list(), (basepower*strength), RED_DAMAGE, check_faction = FALSE, hurt_mechs = TRUE)
+ user.HurtInTurf(T, list(), (basepower*strength), RED_DAMAGE, check_faction = FALSE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE))
to_chat(user, "You opened the gift!")
qdel(src)
opening = FALSE
@@ -288,7 +288,7 @@
var/atom/throw_target = get_edge_target_turf(status_holder, rand_dir)
if(!status_holder.anchored)
status_holder.throw_at(throw_target, rand(1, 3), 7, status_holder)
- status_holder.deal_damage(50, RED_DAMAGE)//Usually a kill, you can block it if you're good
+ status_holder.deal_damage(50, RED_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))//Usually a kill, you can block it if you're good
/datum/status_effect/pranked/proc/TriggerPrank()
//immediately set to 10 seconds, don't shorten if less than 10 seconds remaining
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm b/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm
index f5b90f91948b..a8be26427d69 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/missed_reaper.dm
@@ -94,7 +94,7 @@
if(QDELETED(user))
return
to_chat(user, span_userdanger("[src] stabs you!"))
- user.deal_damage(3000, PALE_DAMAGE)
+ user.deal_damage(3000, PALE_DAMAGE, src, flags = (DAMAGE_FORCED))
playsound(user, 'sound/weapons/fixer/generic/nail1.ogg', 100, FALSE, 4)
return
@@ -196,7 +196,7 @@
B.on = 1
B.break_light_tube()
for(var/mob/living/L in T)
- L.deal_damage(10, PALE_DAMAGE)
+ L.deal_damage(10, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
if(ishuman(L) && L.health < 0)
var/mob/living/carbon/human/H = L
H.Drain()
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm b/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm
index 68ea61f91930..39685da2358d 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/nameless_fetus.dm
@@ -250,7 +250,7 @@
if(!(L in hearers))
hearers += L
to_chat(L, span_warning("The crying hurts your head..."))
- L.deal_damage(pick(1,1.5), WHITE_DAMAGE)
+ L.deal_damage(pick(1,1.5), WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(4)
SLEEP_CHECK_DEATH(3)
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm b/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm
index 24f7d778a1bc..74a72d498b4e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/norinori.dm
@@ -170,7 +170,7 @@
icon_state = IsContained() ? initial(icon_state) : icon_aggro
return
user.visible_message(span_warning("[src] mutilates [user]!"), span_userdanger("[src] mutilates you!"))
- user.deal_damage(1000, RED_DAMAGE)
+ user.deal_damage(1000, RED_DAMAGE, flags = (DAMAGE_FORCED))
playsound(user, 'sound/abnormalities/helper/attack.ogg', 100, FALSE, 4)
attack_sound = initial(attack_sound)
if(user.stat == DEAD)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/pink_shoes.dm b/code/modules/mob/living/simple_animal/abnormality/he/pink_shoes.dm
index ded706edfcf9..5ce0d32ebc26 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/pink_shoes.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/pink_shoes.dm
@@ -405,7 +405,7 @@ GLOBAL_LIST_EMPTY(ribbon_list)
if(!ishuman(owner))
owner.adjustBruteLoss(stacks * -1)//heals abnormalities
return
- H.apply_damage(stacks * 0.5, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE))
+ H.deal_damage(stacks * 0.5, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(H.sanity_lost)
qdel(src)
@@ -745,7 +745,7 @@ GLOBAL_LIST_EMPTY(ribbon_list)
new /obj/effect/temp_visual/ribbon_attack(T)
for(var/mob/living/L in T)
if(ishuman(L))
- L.apply_damage(root_damage, WHITE_DAMAGE, null, spread_damage = TRUE)
+ L.deal_damage(root_damage, WHITE_DAMAGE, master, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
var/mob/living/carbon/human/H = L
if(H.sanity_lost) //drop aggro on panicked people
master.Apply_Urge(H)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm b/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm
index aaf2d6150683..97e73baad09b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/puss_in_boots.dm
@@ -289,10 +289,10 @@
icon_state = icon_aggro
/mob/living/simple_animal/hostile/abnormality/puss_in_boots/proc/Finisher(mob/living/target) //This is super easy to avoid
- target.apply_damage(50, PALE_DAMAGE, null, target.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) //50% of your health in red damage
+ target.deal_damage(50, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL), blocked = target.run_armor_check(null, RED_DAMAGE)) //50% of your health in red damage
to_chat(target, span_danger("[src] is trying to cut you in half!"))
if(!ishuman(target))
- target.deal_damage(50, PALE_DAMAGE)
+ target.deal_damage(100, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //bit more than usual DPS in pale damage
return
if(target.health > 0)
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm b/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm
index 23ac4a88bcf1..53705c77e1d3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/red_buddy.dm
@@ -227,7 +227,7 @@
continue
if(L == awakened_master)
awakened_master.adjustHealth(35) // Takes approximatively 8 howls to take shepherd down
- L.deal_damage(10, WHITE_DAMAGE)
+ L.deal_damage(10, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
heard_awoo = TRUE
if(health >= 75 && heard_awoo && !abused)
adjustHealth(75)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm b/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm
index 4ddf7b6ad522..9b8fd39f80e5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/red_queen.dm
@@ -52,7 +52,7 @@
if(prob(20))
//The Red Queen is fickle, if you're unlucky, fuck you.
user.visible_message(span_warning("An invisible blade slices through [user]'s neck!"))
- user.deal_damage(50, RED_DAMAGE)
+ user.deal_damage(50, RED_DAMAGE, flags = (DAMAGE_FORCED))
new /obj/effect/temp_visual/slice(get_turf(user))
//Fitting sound, I want something crunchy, and also very loud so everyone knows
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm b/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm
index daeace4764d5..21e034c04513 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/red_shoes.dm
@@ -264,7 +264,7 @@
var/mob/living/carbon/human/status_holder = owner
var/usertemp = (get_attribute_level(status_holder, TEMPERANCE_ATTRIBUTE))
var/desire_damage = clamp((80 - (usertemp / 2)),80, 10)//deals between 80 and 10 white damage depending on your temperance attribute when applied.
- status_holder.deal_damage(desire_damage, WHITE_DAMAGE) //DIE!
+ status_holder.deal_damage(desire_damage, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS)) //DIE!
status_holder.adjust_attribute_bonus(PRUDENCE_ATTRIBUTE, -50)//By using bonuses, this lowers your maximum prudence
if(status_holder.sanity_lost)
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm b/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm
index 622502c733ae..a2c32514a1f5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/road_home.dm
@@ -99,20 +99,18 @@
CreateRoad()
-/mob/living/simple_animal/hostile/abnormality/road_home/attackby(obj/item/W, mob/user, params)
+/mob/living/simple_animal/hostile/abnormality/road_home/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- CounterAttack(user)
-
-/mob/living/simple_animal/hostile/abnormality/road_home/bullet_act(obj/projectile/P)
- . = ..()
- CounterAttack(P.firer)
+ if((. <= 0 )|| (!isliving(source)) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
+ return
+ CounterAttack(source)
/mob/living/simple_animal/hostile/abnormality/road_home/proc/CounterAttack(mob/living/attacker)
var/retaliation = 4
var/turf/user_turf = get_turf(attacker)
for(var/obj/effect/golden_road/GR in user_turf.contents)
retaliation = 2
- attacker.deal_damage(retaliation, BLACK_DAMAGE)
+ attacker.deal_damage(retaliation, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_COUNTER))
to_chat(attacker, span_userdanger("[src] counter attacks!"))
if(attacker.has_status_effect(/datum/status_effect/stay_home) || !ishuman(attacker) || stat == DEAD)
return
@@ -329,7 +327,7 @@
playsound(get_turf(src), 'sound/abnormalities/roadhome/House_HouseBoom.ogg', 100, FALSE, 8)
for(var/mob/living/L in orgin.contents)//Listen, if you're still standing in the one turf this thing is falling from, you deserve to die.
- L.deal_damage(200, RED_DAMAGE)
+ L.deal_damage(200, RED_DAMAGE, source = road_home_mob, attack_type = (ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
@@ -339,7 +337,7 @@
for(var/mob/living/L in view(6, src))
if(!road_home_mob.faction_check_mob(L))
var/distance_decrease = get_dist(src, L) * 15
- L.deal_damage((120 - distance_decrease), WHITE_DAMAGE) //white damage so they can join the road home..
+ L.deal_damage((120 - distance_decrease), WHITE_DAMAGE, source = road_home_mob, attack_type = (ATTACK_TYPE_SPECIAL)) //white damage so they can join the road home..
if(!ishuman(L))
continue
var/mob/living/carbon/human/H = L
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm b/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm
index 05921295df61..89313c449646 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/rudolta.dm
@@ -89,6 +89,6 @@
for(var/mob/living/L in livinginview(8, src))
if(faction_check_mob(L))
continue
- L.deal_damage(pulse_damage, WHITE_DAMAGE)
+ L.deal_damage(pulse_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm b/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm
index 9f7bfc597332..d5e111eaefc4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/scarecrow.dm
@@ -133,7 +133,7 @@
H.melee_damage_lower = min_dam_old
H.melee_damage_upper = max_dam_old
H.move_to_delay = punishment_speed
- H.deal_damage(20, WHITE_DAMAGE)
+ H.deal_damage(20, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
H.color = null
H.manual_emote("starts slowing down...")
to_chat(H, span_userdanger("No... I need that wisdom..."))
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm b/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm
index 8c06da9986f5..cce45b9b7db1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/schadenfreude.dm
@@ -113,11 +113,11 @@
return 0
return init_work_chance
-//For when only one person is on the server. The person who works it takes 90 damage minimum per work.
+//For when only one person is on the server. The person who works it takes 54 damage minimum per work.
/mob/living/simple_animal/hostile/abnormality/schadenfreude/Worktick(mob/living/carbon/human/user)
. = ..()
if(total_players == 1)
- user.apply_damage(5, RED_DAMAGE, null, user.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ user.deal_damage(3, RED_DAMAGE, flags = (DAMAGE_FORCED))
/mob/living/simple_animal/hostile/abnormality/schadenfreude/BreachEffect(mob/living/carbon/human/user, breach_type)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm b/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm
index bb4601bd49d7..09929fbab50a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/shock_centipede.dm
@@ -303,7 +303,7 @@
for(var/mob/living/L in view(4, src))
if(faction_check_mob(L))
continue
- L.apply_damage(coil_discharge_aoe_damage, coil_discharge_aoe_damagetype, null, L.run_armor_check(null, coil_discharge_aoe_damagetype), spread_damage = TRUE)
+ L.deal_damage(coil_discharge_aoe_damage, coil_discharge_aoe_damagetype, src, attack_type = (ATTACK_TYPE_SPECIAL))
L.Stun(coil_discharge_aoe_stun_duration)
count ++
playsound(get_turf(src), 'sound/abnormalities/kqe/hitsound2.ogg', 100, 0, 8)
@@ -381,7 +381,7 @@
if(TF.density)
continue
new /obj/effect/temp_visual/smash_effect(TF)
- been_hit = HurtInTurf(TF, been_hit, tailattack_damage, tailattack_damagetype, null, null, TRUE, FALSE, TRUE, TRUE)
+ been_hit = HurtInTurf(TF, been_hit, tailattack_damage, tailattack_damagetype, null, null, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
AdjustCharge(length(been_hit) * tailattack_charge_per_target)
playsound(get_turf(src), 'sound/weapons/fixer/generic/energyfinisher1.ogg', 75, 1)
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm b/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm
index e7bf367613a9..6d44fad6ca2c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/singing_machine.dm
@@ -70,9 +70,9 @@ Finally, an abnormality that DOESN'T have to do any fancy movement shit. It's a
for(var/mob/living/carbon/human/H in livinginrange(playRange, src))
if(faction_check_mob(H))
continue
- H.deal_damage(rand(playStatus * noiseFactor, playStatus * noiseFactor * 2), WHITE_DAMAGE)
+ H.deal_damage(rand(playStatus * noiseFactor, playStatus * noiseFactor * 2), WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if(H in musicalAddicts)
- H.deal_damage(rand(playStatus * noiseFactor, playStatus * noiseFactor * 2), WHITE_DAMAGE)
+ H.deal_damage(rand(playStatus * noiseFactor, playStatus * noiseFactor * 2), WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
to_chat(H, span_warning("You can hear it again... it needs more..."))
else
to_chat(H, span_warning("That terrible grinding noise..."))
@@ -110,7 +110,7 @@ Finally, an abnormality that DOESN'T have to do any fancy movement shit. It's a
/mob/living/simple_animal/hostile/abnormality/singing_machine/Worktick(mob/living/carbon/human/user)
if(bonusRed) // If you have bonus red damage to apply...
- user.deal_damage(bonusRed, RED_DAMAGE)
+ user.deal_damage(bonusRed, RED_DAMAGE, flags = (DAMAGE_FORCED))
if(bonusRed < 6 && playStatus == 0) // Should only happen when the machine isn't dealing damage.
for(var/mob/living/carbon/human/H in livinginrange(30, src))
if(faction_check_mob(H))
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm b/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm
index 74521fc8acfd..3cc69f53d000 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/snow_queen.dm
@@ -324,7 +324,7 @@
dir = dir_to_target
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/L in HurtInTurf(T, list(), 4, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), 4, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
playsound(get_turf(src), 'sound/magic/teleport_app.ogg', 30, 1)
SLEEP_CHECK_DEATH(0.5 SECONDS)
@@ -667,7 +667,7 @@
RVP.NewSnowQueenEffect(T, duration, telegraph)
if(telegraph)
return
- return HurtInTurf(T, list(), 7, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ return HurtInTurf(T, list(), 7, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
//Code taken from big_wolf.dm. Essentially is a 3by3 dash at the target.
/mob/living/simple_animal/hostile/abnormality/snow_queen/proc/BladeDash(dash_target)
@@ -698,7 +698,7 @@
if(isclosedturf(T))
continue
new /obj/effect/temp_visual/slice(T)
- hit_mob = HurtInTurf(T, hit_mob, 4, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = FALSE)
+ hit_mob = HurtInTurf(T, hit_mob, 4, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = FALSE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
can_act = TRUE
icon_state = "snowqueen"
update_icon()
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm b/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm
index 49ccbcb2f45c..9f54262d7178 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/steam_transport_machine.dm
@@ -187,10 +187,10 @@
for(var/mob/living/H in T)
if(faction_check_mob(H))
continue
- H.deal_damage(steam_damage, RED_DAMAGE)
+ H.deal_damage(steam_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_ENVIRONMENT))
adjustBruteLoss(10) //Take some damage every time steam is vented
-/mob/living/simple_animal/hostile/abnormality/steam/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/abnormality/steam/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(steam_venting)
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
index 03e838090205..979b5c8a0766 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/wayward_passenger.dm
@@ -278,7 +278,7 @@
playsound(L, attack_sound, 75, 1)
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/kinetic_blast(LT)
- L.deal_damage(12, RED_DAMAGE)
+ L.deal_damage(12, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
been_hit += L
for(var/obj/vehicle/sealed/mecha/V in turfs_to_hit)
if(V in been_hit)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm b/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm
index c89127f8e1a7..c96d374598dd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/white_lake.dm
@@ -79,7 +79,7 @@
new /obj/effect/temp_visual/whitelake(get_turf(H))
var/userfort = (get_attribute_level(H, FORTITUDE_ATTRIBUTE))
var/damage_dealt = clamp((0 + (userfort / 10)), 6, 13)//deals between 6 and 13 white damage depending on your fortitude attribute when applied.
- H.deal_damage(damage_dealt, WHITE_DAMAGE)
+ H.deal_damage(damage_dealt, WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/whitelake/proc/TurnChampion(mob/living/carbon/human/H)
H.apply_status_effect(STATUS_EFFECT_CHAMPION)
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/will_you_play.dm b/code/modules/mob/living/simple_animal/abnormality/he/will_you_play.dm
index d9335d092299..bd690f71ada7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/will_you_play.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/will_you_play.dm
@@ -99,7 +99,7 @@
//Player wins RPS, loses an arm tho
/mob/living/simple_animal/hostile/abnormality/willyouplay/proc/Win(mob/living/carbon/human/user, work_type)
say("You lose.")
- user.deal_damage(20, RED_DAMAGE)
+ user.deal_damage(20, RED_DAMAGE, flags = (DAMAGE_FORCED))
IncreaseStats(user, 1, FALSE)
//Less than 80 fort and you lose an arm
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm b/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm
index 87ea0e7a7d08..9549a9bde721 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/woodsman.dm
@@ -525,7 +525,7 @@
var/list/been_hit = list()
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, i > 6 ? flurry_big : flurry_small, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ been_hit = HurtInTurf(T, been_hit, i > 6 ? flurry_big : flurry_small, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if (i > 6)
playsound(get_turf(src), 'sound/abnormalities/woodsman/woodsman_strong.ogg', 100, 0, 8) // BAM
else
diff --git a/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm b/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm
index 27e4a78dab95..b1a7a3c13526 100644
--- a/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/he/you_strong.dm
@@ -239,7 +239,7 @@
prosthetic.replace_limb(M)
manual_emote("makes a grinding noise.")
M.emote("scream")
- M.deal_damage(10, BRUTE) // Bro your [X] just got chopped off, no armor's gonna resist that.
+ M.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED)) // Bro your [X] just got chopped off, no armor's gonna resist that.
to_chat(M, span_notice("Your [old_part.name] has been replaced!"))
qdel(old_part)
M.regenerate_icons()
@@ -319,7 +319,7 @@
return
gear = clamp(gear + rand(-1, 3), 1, 10)
UpdateGear()
- src.apply_damage(30, BRUTE, null, 0, spread_damage = TRUE)// OOF OUCH MY BONES
+ src.deal_damage(30, BRUTE, flags = (DAMAGE_FORCED))// OOF OUCH MY BONES
COOLDOWN_START(src, gear_shift, gear_cooldown)
/mob/living/simple_animal/hostile/grown_strong/death(gibbed)
@@ -361,7 +361,7 @@
for(var/mob/living/L in oview(2, src))
if(faction_check_mob(L))
continue
- L.apply_damage(melee_damage_lower, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(melee_damage_lower, RED_DAMAGE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(src, 'sound/weapons/ego/strong_charged2.ogg', 60)
emote("spin")
SLEEP_CHECK_DEATH(5)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm b/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm
index 455f375206cc..3164d48d972a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/MHz.dm
@@ -96,7 +96,7 @@
if(faction_check_mob(L, FALSE) || L.z != z || L.stat == DEAD)
continue
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(L))
- L.deal_damage(6, WHITE_DAMAGE)
+ L.deal_damage(6, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
//We're gonna make it a weather that affects all hallways.
@@ -118,4 +118,4 @@
/datum/weather/mhz/weather_act(mob/living/carbon/human/L)
if(ishuman(L))
- L.deal_damage(2, WHITE_DAMAGE)
+ L.deal_damage(2, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm b/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm
index 37efddc746f0..92e5148c0d71 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/blood_bath.dm
@@ -115,7 +115,7 @@
for(var/turf/T in view(3, src))
var/obj/effect/temp_visual/small_smoke/halfsecond/FX = new(T)
FX.color = "#b52e19"
- for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 10, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/carbon/human/H in HurtInTurf(T, list(), 10, WHITE_DAMAGE, null, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(H.sanity_lost)
H.gib()
playsound(get_turf(src), 'sound/abnormalities/bloodbath/Bloodbath_EyeOn.ogg', 125, FALSE, 6)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm b/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm
index 55f421d19f3d..e6941b699243 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/cinderella.dm
@@ -156,7 +156,7 @@
else
playsound(get_turf(seg), 'sound/abnormalities/cinderella/horse2.ogg', 100, 0, 40)
seg.noise = 1
- M.deal_damage(20, WHITE_DAMAGE)
+ M.deal_damage(20, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
if(ishuman(M))
var/mob/living/carbon/human/C = M
if(C.sanity_lost)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm b/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm
index e55e87b113bd..9a2d41c8f346 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/cleaner.dm
@@ -77,7 +77,7 @@
if(H.stat >= SOFT_CRIT)
continue
visible_message("[src] tosses [H] out of the way!")
- H.deal_damage(bumpdamage, RED_DAMAGE)
+ H.deal_damage(bumpdamage, RED_DAMAGE, src)
var/rand_dir = pick(NORTH, SOUTH, EAST, WEST)
var/atom/throw_target = get_edge_target_turf(H, rand_dir)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm b/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm
index f16cacd32a03..2f742b7202e3 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/crumbling_armor.dm
@@ -226,7 +226,7 @@
if(!istype(holders_head))
return FALSE
playsound(get_turf(status_holder), 'sound/abnormalities/crumbling/attack.ogg', 50, FALSE)
- status_holder.deal_damage(punishment_damage, PALE_DAMAGE)
+ status_holder.deal_damage(punishment_damage, PALE_DAMAGE, flags = (DAMAGE_FORCED))
if(status_holder.health < 0)
holders_head.dismember()
new /obj/effect/temp_visual/slice(get_turf(status_holder))
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm b/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm
index 8f973dd9f9de..8843c3eb4aaa 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/dealerdamned.dm
@@ -52,7 +52,7 @@
var/flip_modifier = 0
has_flipped = TRUE
var/mob/living/user = petter
- user.deal_damage(user.maxHealth*0.2, RED_DAMAGE)
+ user.deal_damage(user.maxHealth*0.2, RED_DAMAGE, flags = (DAMAGE_FORCED))
icon_state = "dealerflip"
manual_emote("flips a gold coin.")
SLEEP_CHECK_DEATH(10)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm b/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm
index 45bd59fae77e..055992794ac1 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/drowned_sisters.dm
@@ -71,7 +71,7 @@
return
to_chat(user, span_userdanger("You are attacked by an invisible assailant!"))
playsound(get_turf(src), 'sound/abnormalities/jangsan/tigerbite.ogg', 75, 0)
- user.deal_damage(50, RED_DAMAGE, null)
+ user.deal_damage(50, RED_DAMAGE, flags = (DAMAGE_FORCED))
if(user.health < 0 || user.stat == DEAD)
user.gib()
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm b/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm
index 41e0c88ec4b8..22c25fd0b2d9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/faelantern.dm
@@ -192,7 +192,7 @@
lure_cooldown = world.time + lure_cooldown_time
playsound(src, 'sound/abnormalities/faelantern/faelantern_giggle.ogg', 100, 0)
for(var/mob/living/carbon/human/victim in view(8, src))
- victim.apply_damage(lure_damage, WHITE_DAMAGE)
+ victim.deal_damage(lure_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(victim in lured_list || victim.stat >= SOFT_CRIT)
continue
if(get_attribute_level(victim, TEMPERANCE_ATTRIBUTE) >= 40)
@@ -262,7 +262,7 @@
if(WEST)
R.pixel_x -= 16
for(var/mob/living/L in T)
- L.deal_damage(root_damage, RED_DAMAGE)
+ L.deal_damage(root_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
qdel(src)
//AI controller, FIXME: reduce duplicate code
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm
index 6c66d11deaaf..a88bf0969ee6 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_gentleman.dm
@@ -227,7 +227,7 @@
jump_damage = 0
else
jump_damage = initial(jump_damage)
- L.deal_damage(jump_damage, BLACK_DAMAGE)
+ L.deal_damage(jump_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
for(var/obj/vehicle/sealed/mecha/V in T)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm
index 918feafa3c32..fa033fa292b4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/fairy_long_legs.dm
@@ -152,7 +152,7 @@
user.visible_message(span_warning("You feel a stinging pain in your chest, is that...blood?!"))
icon_state = "fairy_longlegs_healing"
playsound(get_turf(src), 'sound/abnormalities/fairy_longlegs/heal.ogg', 50, 1)
- user.deal_damage(30, RED_DAMAGE)
+ user.deal_damage(30, RED_DAMAGE, flags = (DAMAGE_FORCED))
for(var/obj/effect/rainy_effect/rain in range(3, src))
rain.End(FALSE)
sleep(1.5 SECONDS)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm b/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm
index 08a21d248a9a..52a5a5b57f61 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/forsaken_employee.dm
@@ -97,5 +97,5 @@
if(!ishuman(AM))
return FALSE
var/mob/living/carbon/human/H = AM
- H.apply_damage(1, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(1, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
. = ..()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm b/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm
index 0a236d03aa43..832a0c98b1b4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/fragment.dm
@@ -142,7 +142,7 @@
continue
if(L.stat == DEAD)
continue
- L.deal_damage(song_damage, WHITE_DAMAGE)
+ L.deal_damage(song_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(3)
animate(src, pixel_y = 0, time = 0)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/hurting_teddy.dm b/code/modules/mob/living/simple_animal/abnormality/teth/hurting_teddy.dm
index 10774292dfc9..dd10be06f39c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/hurting_teddy.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/hurting_teddy.dm
@@ -176,9 +176,9 @@
ReleaseHug()
return
do_attack_animation(get_step(src, dir), no_effect = TRUE)
- hug_victim.deal_damage(hug_damage, BLACK_DAMAGE)
+ hug_victim.deal_damage(hug_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED))
new /obj/effect/temp_visual/smash1(get_turf(src))
- hug_victim.deal_damage(crush_damage, BRUTE)
+ hug_victim.deal_damage(crush_damage, BRUTE, src, flags = (DAMAGE_FORCED))
hug_victim.Immobilize(10)
playsound(get_turf(src), 'sound/abnormalities/sweethome/smash.ogg', 50, 1)
switch(count)
@@ -188,10 +188,10 @@
if(4) //apply more damage
playsound(get_turf(src), 'sound/effects/wounds/crackandbleed.ogg', 200, 0, 7)
to_chat(hug_victim, span_userdanger("It hurts so much!"))
- hug_victim.deal_damage(crush_damage, BRUTE)
+ hug_victim.deal_damage(crush_damage, BRUTE, src, flags = (DAMAGE_FORCED))
else //Apply ramping damage
playsound(get_turf(src), 'sound/effects/wounds/crackandbleed.ogg', 200, 0, 7)
- hug_victim.deal_damage((crush_damage + count), BRUTE)
+ hug_victim.deal_damage((crush_damage + count), BRUTE, src, flags = (DAMAGE_FORCED))
count += 1
if(hug_victim.sanity_lost)
hug_victim.Stun(10)
@@ -203,10 +203,10 @@
hug_victim = null
can_act = TRUE
-/mob/living/simple_animal/hostile/abnormality/hurting_teddy/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/abnormality/hurting_teddy/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(hug_victim)
- release_damage = clamp (release_damage + damage, 0, release_threshold)
+ release_damage = clamp (release_damage + ., 0, release_threshold)
if(release_damage >= release_threshold)
ReleaseHug()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm b/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm
index f651950dfc54..0f640e2bf392 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/lady_facing_the_wall.dm
@@ -64,7 +64,7 @@
if(L.stat == DEAD)
continue
playsound(get_turf(src), 'sound/spookoween/girlscream.ogg', 400)
- L.deal_damage(scream_damage, WHITE_DAMAGE)
+ L.deal_damage(scream_damage, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/wall_gazer/PostWorkEffect(mob/living/carbon/human/user, work_type, pe, work_time)
// If you do work while having low Temperance, fuck you and you go insane for turning your back to face her
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm b/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm
index 845b09761b5a..85a39d8f812a 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/meat_lantern.dm
@@ -103,7 +103,7 @@
for(var/mob/living/L in oview(1, src))
if(faction_check_mob(L))
continue
- L.deal_damage(chop_damage, RED_DAMAGE)
+ L.deal_damage(chop_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib(FALSE,FALSE,TRUE)
SLEEP_CHECK_DEATH(2.5)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm b/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm
index 972d32b5bbb7..462dce745c2b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/my_sweet_home.dm
@@ -109,7 +109,7 @@
var/turf/target_turf = get_turf(src)
for(var/turf/open/T in view(target_turf, 3))
hit_turfs |= T
- for(var/mob/living/L in HurtInTurf(T, list(), ranged_damage, RED_DAMAGE, hurt_mechs = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), ranged_damage, RED_DAMAGE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if((L.stat < DEAD) && !(L.status_flags & GODMODE))
damage_dealt += ranged_damage
if(damage_dealt > 0)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm b/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm
index f7298196e367..9a96752f27ea 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/pale_horse.dm
@@ -70,7 +70,7 @@
if(user.health < (user.maxHealth * 0.5))
return
else
- user.deal_damage(work_damage_upper, PALE_DAMAGE)
+ user.deal_damage(work_damage_upper, PALE_DAMAGE, flags = (DAMAGE_FORCED))
/mob/living/simple_animal/hostile/abnormality/pale_horse/Initialize()
. = ..()
@@ -127,7 +127,7 @@
for(var/mob/living/H in T)
if(faction_check_mob(H))
continue
- H.deal_damage(fog_damage, PALE_DAMAGE)
+ H.deal_damage(fog_damage, PALE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
/mob/living/simple_animal/hostile/abnormality/pale_horse/Moved() //more damaging fog when moving
@@ -172,7 +172,7 @@
for(var/mob/living/H in F)
if(faction_check_mob(H))
continue
- H.deal_damage(ash_damage, PALE_DAMAGE)
+ H.deal_damage(ash_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(H.health < 0 && ishuman(H))
H.dust()
T.dust()
@@ -293,7 +293,7 @@
icon_state = "mortis"
/datum/status_effect/mortis/tick()
- owner.deal_damage(damage, PALE_DAMAGE)
+ owner.deal_damage(damage, PALE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(owner.health < 0 && ishuman(owner))
owner.dust()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm b/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm
index cefde42ee203..90c8f4e3c170 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/penitent_girl.dm
@@ -52,7 +52,7 @@
// you are going to cut your own leg off
work_damage_type = initial(work_damage_type)
if((get_attribute_level(user, TEMPERANCE_ATTRIBUTE) < 40) && (get_attribute_level(user, PRUDENCE_ATTRIBUTE) < 40))
- user.deal_damage(50, WHITE_DAMAGE) //DIE!
+ user.deal_damage(50, WHITE_DAMAGE, flags = (DAMAGE_FORCED)) //DIE!
if(user.sanity_lost)
user.apply_status_effect(STATUS_EFFECT_PENITENCE)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm b/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm
index 77202866e448..18836ccda6e9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/ppodae.dm
@@ -269,7 +269,7 @@
var/smash_damage = rand(smash_damage_low, smash_damage_high)
for(var/turf/T in area_of_effect)
new /obj/effect/temp_visual/smash_effect(T)
- HurtInTurf(T, list(), smash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE)
+ HurtInTurf(T, list(), smash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/abnormalities/ppodae/bark.wav', 100, 0, 5)
playsound(get_turf(src), 'sound/abnormalities/ppodae/attack.wav', 50, 0, 5)
SLEEP_CHECK_DEATH(0.5 SECONDS)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm b/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm
index f826a26b6b93..ca91c8f53a59 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/punishing_bird.dm
@@ -204,7 +204,7 @@
if(L in pecking_targets)
pecking_targets -= L
already_punished |= L
- target = null
+ LoseTarget(FALSE)
else if(L.health <= 0)
visible_message(span_danger("\The [src] devours [L]!"))
L.gib()
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm b/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm
index 5bbff0afec9d..745e9d32a5f2 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/scorched_girl.dm
@@ -148,8 +148,8 @@
// Ka-boom
playsound(get_turf(src), 'sound/abnormalities/scorchedgirl/explosion.ogg', 125, 0, 8)
for(var/mob/living/carbon/human/H in view(7, src))
- H.deal_damage(boom_damage, RED_DAMAGE)
- H.deal_damage(boom_damage * 0.5, FIRE)
+ H.deal_damage(boom_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
+ H.deal_damage(boom_damage * 0.5, FIRE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(H.health < 0)
H.gib()
if(SSmaptype.maptype == "limbus_labs")
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm b/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm
index dd3766badb55..6d0a3653b0a2 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/so_that_no_cry.dm
@@ -106,7 +106,7 @@
//Breach Mechanics
// All damage reflection stuff is down here
-/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/proc/ReflectDamage(mob/living/attacker, attack_type = RED_DAMAGE, damage)
+/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/proc/ReflectDamage(mob/living/attacker, damage_type = RED_DAMAGE, damage)
if(damage < 1)
return
if(!damage_reflection)
@@ -118,7 +118,7 @@
playsound(src, 'sound/abnormalities/so_that_no_cry/counter.ogg', min(15 + damage, 100), TRUE, 4)
attacker.visible_message(span_danger("[src] hits [attacker] with a barrage of punches!"), span_userdanger("[src] counters your attack!"))
do_attack_animation(attacker)
- attacker.deal_damage(damage, attack_type)
+ attacker.deal_damage(damage, damage_type)
new /obj/effect/temp_visual/revenant(get_turf(attacker))
/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/Move()
@@ -130,56 +130,47 @@
..()
if(!.)
return
- if(damage_reflection && M.a_intent == INTENT_HARM)
- ReflectDamage(M, M?.dna?.species?.attack_type, M?.dna?.species?.punchdamagehigh)
if(ishuman(M))
TryAttachTalisman(M)
/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/attack_paw(mob/living/carbon/human/M)
..()
- if(damage_reflection && M.a_intent != INTENT_HELP)
- ReflectDamage(M, M?.dna?.species?.attack_type, 5)
if(ishuman(M))
TryAttachTalisman(M)
-/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/attack_animal(mob/living/simple_animal/M)
- . = ..()
- if(!damage_reflection)
- return
- if(.)
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- if(damage > 0)
- ReflectDamage(M, M.melee_damage_type, damage)
-
-/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE)
- ..()
- if(damage_reflection && Proj.firer)
- if(get_dist(Proj.firer, src) < 5)
- ReflectDamage(Proj.firer, Proj.damage_type, Proj.damage)
-
/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/attackby(obj/item/I, mob/living/user, params)
..()
if(ishuman(user))
TryAttachTalisman(user)
- if(!damage_reflection)
+
+/// While reflecting, all damage on us will be prevented. This is basically just keeping the original behaviour of STNWC: it used to set its coeffs to 0 while deflecting.
+/// On top of that, we will counterattack against certain kinds of attacks.
+// Mind, any damage that uses the DAMAGE_FORCED flag will punch through this.
+/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/PreDamageReaction(damage_amount, damage_type, source, attack_type)
+ . = ..()
+ if(!damage_reflection || !isliving(source)) // Only execute the rest of the code if we're reflecting damage and we were provided with a source for it
return
- var/damage = I.force
- if(ishuman(user))
- damage *= 1 + (get_attribute_level(user, JUSTICE_ATTRIBUTE)/100)
- ReflectDamage(user, I.damtype, damage)
+ if((attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS))) // Don't counter these types of attacks, but prevent the damage on them anyway.
+ return FALSE
+ if((attack_type & (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL)) && get_dist(src, source) >= 5) // Counter these types of attacks only if within 5 tiles (as it used to work)
+ return FALSE
+
+ ReflectDamage(source, damage_type, damage_amount)
+ return FALSE // Damage is prevented on us yippee
-//Reflect Code
-/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
+// Tallies up incoming damage and enters damage reflection after taking 400 (cumulative).
+/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(. > 0)
damage_taken += .
- if(health < 0)
+ if(health < 0 || stat >= DEAD)
damage_reflection = FALSE
return
if(!can_act)
return
if(damage_taken > maxHealth * 0.4 && !damage_reflection)
- StartReflecting()
+ damage_reflection = TRUE
+ INVOKE_ASYNC(src, PROC_REF(StartReflecting))
/mob/living/simple_animal/hostile/abnormality/so_that_no_cry/proc/StartReflecting()
can_act = FALSE
@@ -188,10 +179,8 @@
playsound(src, 'sound/abnormalities/so_that_no_cry/prepare.ogg', 50, TRUE, 7)
visible_message(span_warning("[src] assumes a stance!"))
icon_state = "so_that_no_cry_guard"
- ChangeResistances(list(RED_DAMAGE = 0, WHITE_DAMAGE = 0, BLACK_DAMAGE = 0, PALE_DAMAGE = 0))
SLEEP_CHECK_DEATH(10 SECONDS)
icon_state = icon_living
- ChangeResistances(list(RED_DAMAGE = 1.5, WHITE_DAMAGE = 1, BLACK_DAMAGE = 1, PALE_DAMAGE = 2))
damage_reflection = FALSE
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm b/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm
index 418bd87eb681..33e26f8d29e7 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/spider_bud.dm
@@ -132,7 +132,7 @@
spooder.metagame_list[sinner.ckey] = 0
spooder.metagame_list[sinner.ckey] += 1
- sinner.deal_damage(50 * spooder.metagame_list[sinner.ckey], RED_DAMAGE)
+ sinner.deal_damage(50 * spooder.metagame_list[sinner.ckey], RED_DAMAGE, flags = (DAMAGE_FORCED))
to_chat(sinner, span_userdanger("As the cocoon breaks tiny spiders swarm you and tear out some of your flesh before returning to [spooder]!"))
if(sinner.stat == DEAD) // if they are dead after our attack, burger them
spooder.turn_into_burger(sinner, TRUE)
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/tangle.dm b/code/modules/mob/living/simple_animal/abnormality/teth/tangle.dm
index 4969a624ca3a..2da3af8e7fae 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/tangle.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/tangle.dm
@@ -141,7 +141,7 @@
. = ..()
if(ishuman(AM))
var/mob/living/carbon/human/H = AM
- H.apply_damage(1, WHITE_DAMAGE, null, H.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(1, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT), blocked = H.run_armor_check(null, RED_DAMAGE))
if(prob(10))
H.Immobilize(5)
to_chat(H, span_warning("You get caught in the hair!"))
diff --git a/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm b/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm
index cd77b493838a..69f1464687bd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/teth/void_dream.dm
@@ -138,7 +138,7 @@
L.SetSleeping(0)
L.adjustSanityLoss(1000) //Die.
continue
- L.deal_damage(pulse_damage, WHITE_DAMAGE)
+ L.deal_damage(pulse_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/i = 1 to 5)
var/obj/effect/temp_visual/screech/S = new(get_turf(src))
S.pixel_y = 16
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm b/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm
index 2c1c0036184b..9f1a52d4eba8 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/alriune.dm
@@ -93,7 +93,7 @@
continue
if(L.stat == DEAD)
continue
- L.deal_damage(pulse_damage, WHITE_DAMAGE)
+ L.deal_damage(pulse_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/alriune_attack(get_turf(L))
if(ishuman(L))
var/mob/living/carbon/human/H = L
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm b/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm
index df063b1d4e54..4e0e95bada81 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/apex_predator.dm
@@ -135,7 +135,7 @@
var/mob/living/V = attacked_target
visible_message(span_danger("The [src] rips out [attacked_target]'s guts!"))
new /obj/effect/gibspawner/generic(get_turf(V))
- V.deal_damage(backstab_damage, RED_DAMAGE)
+ V.deal_damage(backstab_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
//Backstab succeeds from any one of 3 tiles behind a mecha, backstab from directly behind gets boosted by mecha directional armor weakness
else if(ismecha(attacked_target))
var/relative_angle = abs(dir2angle(attacked_target.dir) - dir2angle(get_dir(attacked_target, src)))
@@ -212,7 +212,7 @@
icon_state = "apex_crouch"
playsound(src, 'sound/effects/meteorimpact.ogg', 300, FALSE, 9)
for(var/turf/T in range(1, src))
- HurtInTurf(T, list(), jump_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE)
+ HurtInTurf(T, list(), jump_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/kinetic_blast(T)
addtimer(CALLBACK(src, PROC_REF(Reset)), 12)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/ardor_blossom_moth.dm b/code/modules/mob/living/simple_animal/abnormality/waw/ardor_blossom_moth.dm
index 83173780d956..7e8566f65c98 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/ardor_blossom_moth.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/ardor_blossom_moth.dm
@@ -314,7 +314,7 @@
continue
if (L == src)
continue
- HurtInTurf(T, list(), rand(melee_damage_lower, melee_damage_upper), melee_damage_type, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), rand(melee_damage_lower, melee_damage_upper), melee_damage_type, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE))
L.apply_lc_burn(6)
SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, L)
L.visible_message(span_danger("\The [src] [attack_verb_continuous] [L]!"), \
@@ -389,8 +389,8 @@
for(var/turf/T in view(get_turf(src), 3))
CreateFire(T)
for(var/mob/living/carbon/human/H in view(2, src))
- H.deal_damage(explode_charge_explosion_damage, RED_DAMAGE)
- H.deal_damage(explode_charge_explosion_damage * 0.5, FIRE)
+ H.deal_damage(explode_charge_explosion_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
+ H.deal_damage(explode_charge_explosion_damage * 0.5, FIRE, src, attack_type = (ATTACK_TYPE_SPECIAL))
H.apply_lc_burn(10)
if(H.health < 0)
H.gib()
@@ -418,8 +418,8 @@
for(var/turf/T in view(get_turf(src), 7))
CreateFire(T)
for(var/mob/living/carbon/human/H in view(3, src))
- H.deal_damage(explode_charge_explosion_damage * 2, RED_DAMAGE)
- H.deal_damage(explode_charge_explosion_damage, FIRE)
+ H.deal_damage(explode_charge_explosion_damage * 2, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
+ H.deal_damage(explode_charge_explosion_damage, FIRE, src, attack_type = (ATTACK_TYPE_SPECIAL))
H.apply_lc_burn(30)
if(H.health < 0)
H.gib()
@@ -435,7 +435,7 @@
/obj/effect/turf_fire/ardor/DoDamage(mob/living/fuel)
if(ishuman(fuel))
- fuel.deal_damage(0.5, FIRE)
+ fuel.deal_damage(0.5, FIRE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
fuel.apply_lc_burn(1)
/obj/effect/embers
@@ -465,7 +465,7 @@
chance = 10//Taking your time is key to not getting scorched... most of the time
if(prob(chance))
to_chat(L, span_userdanger("A burning ember attaches to you!"))
- L.deal_damage(min(2, L.maxHealth/20), FIRE)//Just so Clerks won't eat shit and die
+ L.deal_damage(min(2, L.maxHealth/20), FIRE, attack_type = (ATTACK_TYPE_ENVIRONMENT))//Just so Clerks won't eat shit and die
L.apply_lc_burn(1)
if(ishuman(L) && connected_abno)
if(!connected_abno.datum_reference.working)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm b/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm
index 823640461b3e..e71f156c7439 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/babayaga.dm
@@ -162,9 +162,9 @@
continue
var/dist = get_dist(src, L)
if(ishuman(L)) //Different damage formulae for humans vs mobs
- L.deal_damage(clamp((5 * (2 ** (8 - dist))), 5, 100), RED_DAMAGE)
+ L.deal_damage(clamp((5 * (2 ** (8 - dist))), 5, 100), RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
else
- L.deal_damage(200 - ((dist > 2 ? dist : 0 )* 25), RED_DAMAGE) //0-600 damage scaling on distance, we don't want it oneshotting mobs
+ L.deal_damage(200 - ((dist > 2 ? dist : 0 )* 25), RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //0-600 damage scaling on distance, we don't want it oneshotting mobs
if(L.health < 0)
L.gib()
SLEEP_CHECK_DEATH(5)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm b/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm
index 7a6864588bd1..64bb1fc8e9cd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/big_wolf.dm
@@ -223,7 +223,7 @@
playsound(get_turf(src), 'sound/abnormalities/big_wolf/Wolf_FogChange.ogg', 75, 1)
ADD_TRAIT(src, TRAIT_MOVE_PHASING, "fleeing")
AIStatus = AI_OFF
- target = null
+ LoseTarget(FALSE)
walk_to(src, 0)
TemporarySpeedChange(-2, 3 SECONDS)
fleeing_now = TRUE
@@ -317,9 +317,9 @@
if(isclosedturf(T))
continue
new /obj/effect/temp_visual/slice(T)
- hit_mob = HurtInTurf(T, hit_mob, 15, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE)
+ hit_mob = HurtInTurf(T, hit_mob, 15, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
for(var/mob/living/simple_animal/hostile/abnormality/red_hood/mercenary in hit_mob)
- mercenary.deal_damage(50, RED_DAMAGE) //triple damge to red
+ mercenary.deal_damage(50, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //triple damge to red
can_act = TRUE
//Used in Steel noons for if they are allowed to fly through something.
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm b/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm
index 49bb63837b68..9d578586c7b6 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/black_swan.dm
@@ -268,7 +268,7 @@
continue
if(L.stat == DEAD)
continue
- L.deal_damage(25, WHITE_DAMAGE)
+ L.deal_damage(25, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/abnormalities/blackswan/sis_roar.ogg', 30, 0, 4)
cut_overlay(visual_overlay)
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/caterpillar.dm b/code/modules/mob/living/simple_animal/abnormality/waw/caterpillar.dm
index 1b50b71cfcc9..a9be2e134387 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/caterpillar.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/caterpillar.dm
@@ -132,7 +132,7 @@
C.smoke_delay++
addtimer(CALLBACK(src, PROC_REF(remove_smoke_delay), C), 10)
- C.deal_damage(27, PALE_DAMAGE)
+ C.deal_damage(27, PALE_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
to_chat(C, span_danger("IT BURNS!"))
C.emote("scream")
return TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm
index b063e07d81cb..a96ac74b9047 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/clouded_monk.dm
@@ -264,7 +264,7 @@
to_chat(L, span_userdanger("[src] slams you!"))
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/kinetic_blast(LT)
- L.apply_damage(slam_damage,RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(slam_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(L, 'sound/creatures/lc13/lovetown/slam.ogg', 75, 1)
/mob/living/simple_animal/hostile/abnormality/clouded_monk/proc/ResetCharge()
@@ -285,7 +285,7 @@
shake_camera(src, 2, 3)
if(ishuman(L))
var/mob/living/carbon/human/H = A
- H.deal_damage(charge_damage, RED_DAMAGE)
+ H.deal_damage(charge_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(H.health < 0)
H.gib()
adjustBruteLoss(-heal_amount)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm b/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm
index cd75d62bcb93..8ff217b2e35b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/clown_smiling.dm
@@ -143,7 +143,7 @@
return
TH.attack_animal(src)
for(var/mob/living/carbon/human/H in ohearers(7, get_turf(src)))
- H.deal_damage(finishing_small_damage, WHITE_DAMAGE)
+ H.deal_damage(finishing_small_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(2)
if(!targets_from.Adjacent(TH) || QDELETED(TH))
finishing = FALSE
@@ -151,7 +151,7 @@
playsound(get_turf(src), 'sound/abnormalities/clownsmiling/final_stab.ogg', 50, 1)
TH.gib()
for(var/mob/living/carbon/human/H in ohearers(7, get_turf(src)))
- H.deal_damage(finishing_big_damage, WHITE_DAMAGE)
+ H.deal_damage(finishing_big_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/clown/MoveToTarget(list/possible_targets)
if(ranged_cooldown <= world.time)
@@ -205,7 +205,7 @@
playsound(get_turf(src), 'sound/abnormalities/clownsmiling/announcedead.ogg', 75, 1)
for(var/mob/living/L in view(5, src))
if(!faction_check_mob(L))
- L.deal_damage(10, RED_DAMAGE)
+ L.deal_damage(10, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
if(IsCombatMap())
L.apply_lc_bleed(30)
new /obj/effect/particle_effect/foam(get_turf(src))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm b/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm
index 8003f6465c9e..31ba09031264 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/dimension_refraction.dm
@@ -57,7 +57,7 @@
for(var/mob/living/L in livinginview(1, src))
if(faction_check_mob(L))
continue
- L.deal_damage(aoe_damage, RED_DAMAGE)
+ L.deal_damage(aoe_damage, RED_DAMAGE, flags = (DAMAGE_UNTRACKABLE | DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
addtimer(CALLBACK(src, PROC_REF(Melter)), cooldown_time)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm b/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm
index bc27e26bc55d..7a2b8a31501e 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/dreaming_current.dm
@@ -203,7 +203,7 @@
COLOR_PURPLE,
)
S.add_atom_colour(pick(potential_colors), FIXED_COLOUR_PRIORITY)
- var/list/new_hits = HurtInTurf(TF, been_hit, dash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(TF, been_hit, dash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
visible_message(span_boldwarning("[src] bites [L]!"))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm b/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm
index 547197b22eb8..210e0c900f74 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/ebony_queen.dm
@@ -285,7 +285,7 @@
return
playsound(target_turf, 'sound/abnormalities/ebonyqueen/attack.ogg', 40, 0, 8)
new /obj/effect/temp_visual/thornspike(target_turf)
- var/list/hit = caster.HurtInTurf(target_turf, list(), damage = root_damage, damage_type = BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = root_damage/2)
+ var/list/hit = caster.HurtInTurf(target_turf, list(), damage = root_damage, damage_type = BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = root_damage/2, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in hit)
if(L.stat == DEAD || L.throwing)
continue
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm b/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm
index c2d96f9244c3..74e453514d34 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/express_train.dm
@@ -190,7 +190,7 @@
else
playsound(get_turf(seg), 'sound/abnormalities/expresstrain/express_whistle.ogg', 100, 0, 40)
seg.noise = 1
- M.deal_damage(100, BLACK_DAMAGE)
+ M.deal_damage(100, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
var/atom/throw_target = locate(M)
throw_target = locate(M.x, M.y + pick(rand(-8, -5), rand(5, 8)), M.z)
if(!M.anchored)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm
index 24691aaa80f9..bc5b91866e15 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/fire_bird.dm
@@ -150,8 +150,8 @@
/mob/living/simple_animal/hostile/abnormality/fire_bird/proc/crispynugget()
pulse_cooldown = world.time + pulse_cooldown_time
for(var/mob/living/carbon/human/L in livinginview(48, src))
- L.deal_damage(pulse_damage, RED_DAMAGE)
- L.deal_damage(pulse_damage * 0.5, FIRE)
+ L.deal_damage(pulse_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
+ L.deal_damage(pulse_damage * 0.5, FIRE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/fire_bird/proc/retaliatedash()
if(dash_cooldown > world.time)
@@ -200,11 +200,11 @@
if(L in been_hit)
continue
visible_message(span_boldwarning("[src] blazes through [L]!"))
- L.deal_damage(dash_damage, WHITE_DAMAGE)
- L.deal_damage(dash_damage * 0.1, FIRE)
+ L.deal_damage(dash_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
+ L.deal_damage(dash_damage * 0.1, FIRE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/cleave(get_turf(L))
if(L.sanity_lost) // TODO: TEMPORARY AS HELL
- L.deal_damage(999, FIRE)
+ L.deal_damage(999, FIRE, src, flags = (DAMAGE_FORCED))
if(!(L in been_hit))
been_hit += L
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm b/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm
index f19a423561c8..729cc033d599 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/flesh_idol.dm
@@ -81,7 +81,7 @@
var/list/damtypes = list(RED_DAMAGE, WHITE_DAMAGE, BLACK_DAMAGE, PALE_DAMAGE)
var/damage = pick(damtypes)
work_damage_type = damage
- user.deal_damage(damage_amount, damage) // take 5 random damage each time
+ user.deal_damage(damage_amount, damage, flags = (DAMAGE_FORCED)) // take 5 random damage each time
WorkDamageEffect()
//Prevents red work damage effecs from appearing
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm b/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm
index 7d33d78595db..b6d034b82dbc 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/generalb.dm
@@ -496,9 +496,9 @@
if(faction_check(faction, L.faction, FALSE))
continue
if(SSmaptype.maptype == "limbus_labs")
- L.deal_damage(boom_damage*0.5, list(RED_DAMAGE, BLACK_DAMAGE))
+ L.deal_split_damage(boom_damage*0.5, list(RED_DAMAGE, BLACK_DAMAGE), attack_type = (ATTACK_TYPE_SPECIAL))
else
- L.deal_damage(boom_damage, list(RED_DAMAGE, BLACK_DAMAGE))
+ L.deal_split_damage(boom_damage, list(RED_DAMAGE, BLACK_DAMAGE), attack_type = (ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
new /obj/effect/temp_visual/explosion(get_turf(src))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm b/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm
index ca9ff4bfb75c..04d8db67e063 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/greed_king.dm
@@ -162,15 +162,13 @@
addtimer(CALLBACK(src, PROC_REF(startTeleport)), 5 SECONDS)
/mob/living/simple_animal/hostile/abnormality/greed_king/proc/charge_check()
- //targeting
- var/mob/living/carbon/human/target
if(!can_act)
return
var/list/possible_targets = list()
for(var/mob/living/carbon/human/H in view(20, src))
possible_targets += H
if(LAZYLEN(possible_targets))
- target = pick(possible_targets)
+ FindTarget(list(pick(possible_targets)), TRUE) // The list(pick()) here makes it equally likely for anyone to be targeted. If you removed it, it'd be based on individual threat level
//Start charge
var/dir_to_target = get_cardinal_dir(get_turf(src), get_turf(target))
if(dir_to_target)
@@ -223,7 +221,7 @@
//Hiteffect stuff
for(var/turf/U in range(1, T))
- var/list/new_hits = HurtInTurf(U, been_hit, 0, RED_DAMAGE, hurt_mechs = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(U, been_hit, 0, RED_DAMAGE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
if(!nihil_present)
@@ -231,7 +229,7 @@
playsound(L, attack_sound, 75, 1)
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
if(ishuman(L))
- L.deal_damage(charge_damage, RED_DAMAGE)
+ L.deal_damage(charge_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
else
L.adjustRedLoss(100)
if(L.stat >= HARD_CRIT)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm b/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm
index 115c0c36f636..3943ae127d4b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/hatred_queen.dm
@@ -386,7 +386,7 @@
affected_turfs += TT
var/obj/effect/temp_visual/TV = new /obj/effect/temp_visual/revenant(TT)
TV.color = COLOR_SOFT_RED
- beats_hit = HurtInTurf(TT, beats_hit, beats_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ beats_hit = HurtInTurf(TT, beats_hit, beats_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/hatred_queen/proc/BeamAttack(target)
if(beam_cooldown > world.time)
@@ -518,7 +518,7 @@
continue
var/damage_before = L.get_damage_amount(BRUTE)
var/truedamage = ishuman(L) ? beam_damage_final : beam_damage_final/2 //half damage dealt to nonhumans
- L.deal_damage(truedamage, BLACK_DAMAGE)
+ L.deal_damage(truedamage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
var/damage_dealt = abs(L.get_damage_amount(BRUTE)-damage_before)
if(!friendly)
if(ishuman(L))
@@ -608,7 +608,7 @@
new_matrix.Scale(1.75)
VO.transform = new_matrix
for(var/turf/open/T in view(2, src))
- HurtInTurf(T, list(), explode_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), explode_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/abnormality/hatred_queen/WorkChance(mob/living/carbon/human/user, chance)
return chance * chance_modifier
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm
index 425b1276426b..f2cf57cdee99 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/judgement_bird.dm
@@ -117,7 +117,7 @@
var/dist = get_dist(src, L)
if(dist > 5)
dealt_damage -= (dist - 5) * 5
- L.deal_damage(dealt_damage, PALE_DAMAGE)
+ L.deal_damage(dealt_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
else
for(var/mob/living/L in urange(judgement_range, src))
@@ -130,7 +130,7 @@
var/dist = get_dist(src, L)
if(dist > 5)
dealt_damage -= (dist - 5) * 5
- L.deal_damage(dealt_damage, PALE_DAMAGE)
+ L.deal_damage(dealt_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
if(L.stat == DEAD) //Gotta fucking check again in case it kills you. Real moment
if(!IsCombatMap())
@@ -154,7 +154,7 @@
var/dist = get_dist(src, V)
if(dist > 5)
dealt_damage -= (dist - 5) * 5
- occupant.deal_damage(dealt_damage, PALE_DAMAGE)
+ occupant.deal_damage(dealt_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
icon_state = icon_living
judging = FALSE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm b/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm
index cc27555e7b0f..9c0bf5b79696 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/little_prince.dm
@@ -73,7 +73,7 @@
/mob/living/simple_animal/hostile/abnormality/little_prince/proc/Hypno(mob/living/carbon/human/user)
if (!(user.sanity_lost))
playsound(get_turf(user), 'sound/abnormalities/littleprince/Prince_Active.ogg', 50, 0, 2)
- user.deal_damage(user.maxSanity, WHITE_DAMAGE)
+ user.deal_damage(user.maxSanity, WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if (!(user.sanity_lost))
//Check Sanity twice to make sure you're actually insane
twice -= user
@@ -310,7 +310,7 @@
//The Damage Proc
/obj/effect/prince_mushrooms/proc/DoDamage(mob/living/carbon/human/H)
- H.deal_damage(rand(1, 3), WHITE_DAMAGE)
+ H.deal_damage(rand(1, 3), WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
to_chat(H, span_warning("You feel something weird touching your skin..."))
if (H.sanity_lost && connected_abno)
connected_abno.Hypno(H)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm b/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm
index a5efafcb0419..c8068a606785 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/luna.dm
@@ -107,7 +107,7 @@
/mob/living/simple_animal/hostile/abnormality/luna/Worktick(mob/living/carbon/human/user, work_type)
if(performance)
- user.deal_damage(work_damage_upper*0.60, BLACK_DAMAGE) //take work damage
+ user.deal_damage(work_damage_upper*0.60, BLACK_DAMAGE, flags = (DAMAGE_FORCED)) //take work damage
/mob/living/simple_animal/hostile/abnormality/luna/AttemptWork(mob/living/carbon/human/user, work_type)
@@ -197,7 +197,7 @@
/mob/living/simple_animal/hostile/luna/proc/AOE()
for(var/turf/T in view(aoerange, src))
new /obj/effect/temp_visual/revenant(T)
- HurtInTurf(T, list(), aoedamage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), aoedamage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
aoeactive = FALSE
/mob/living/simple_animal/hostile/luna/proc/Reset()
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm b/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm
index f6a5a70bfe82..2bc7562917a9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/my_form_empties.dm
@@ -152,7 +152,7 @@
SLEEP_CHECK_DEATH(10)
for(var/turf/T in view(staff_range, get_turf(staff)))
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, staff_damage, WHITE_DAMAGE, check_faction = FALSE, hurt_mechs = TRUE, mech_damage = staff_damage)
+ been_hit = HurtInTurf(T, been_hit, staff_damage, WHITE_DAMAGE, check_faction = FALSE, hurt_mechs = TRUE, mech_damage = staff_damage, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
for(var/mob/living/L in T)
ApplyKarma(L, 15)
animate(staff, transform = turn(matrix(), 15) ,time = 2)
@@ -166,7 +166,7 @@
continue
if(faction_check_mob(L))
continue
- L.deal_damage(pulse_damage, WHITE_DAMAGE)//apply karma here
+ L.deal_damage(pulse_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED))//apply karma here
ApplyKarma(L, 5)
extended_flash_color(L, flash_color = "#FDAE8B", flash_time = 1,maintain_time = 115)
if(!ishuman(L))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm b/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm
index 32fd08b32077..e5b02b4f7205 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/naked_nest.dm
@@ -401,7 +401,7 @@
/obj/item/organ/naked_nest/proc/TransformOverride(mob/living/carbon/human/H)
if(H && H.has_status_effect(/datum/status_effect/display/melting_love_blessing))
to_chat(H, span_warning("Something in your head writhes as pink slime starts to pour out of your mouth."))
- H.deal_damage(800, BLACK_DAMAGE)
+ H.deal_damage(270, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
H.remove_status_effect(/datum/status_effect/display/melting_love_blessing)
if(!H || H.stat == DEAD)
return TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm b/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm
index 498d7c46282c..9ba4c787f18f 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/nosferatu.dm
@@ -417,7 +417,7 @@
var/obj/effect/temp_visual/smash_effect/bloodeffect = new(T)
bloodeffect.color = "#b52e19"
playsound(T, 'sound/abnormalities/nosferatu/attack_special.ogg', 25, 0, 5)
- for(var/mob/living/L in HurtInTurf(T, list(), banquet_damage, BLACK_DAMAGE, check_faction = TRUE, exact_faction_match = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), banquet_damage, BLACK_DAMAGE, check_faction = TRUE, exact_faction_match = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, break_not_destroy = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
all_turfs -= T
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -426,7 +426,7 @@
AdjustThirst(H.blood_volume) // gain up to 2000 blood by draining a corpse
H.Drain()
else
- L.deal_damage(banquet_damage * 0.5, BLACK_DAMAGE) // deal extra damage instead of bleed to nonhumans
+ L.deal_damage(banquet_damage * 0.5, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) // deal extra damage instead of bleed to nonhumans
/mob/living/simple_animal/hostile/abnormality/nosferatu/proc/MistForm()
if(!can_act)
@@ -461,8 +461,8 @@
return
mist_cooldown = world.time + mist_cooldown_time
MistForm()
- AIStatus = AI_OFF
- target = null
+ toggle_ai(AI_OFF)
+ LoseTarget(FALSE)
walk_to(src, 0)
TemporarySpeedChange(-2, 3 SECONDS)
//stolen from patrol select
@@ -483,7 +483,7 @@
StopFleeing()
/mob/living/simple_animal/hostile/abnormality/nosferatu/proc/StopFleeing()
- AIStatus = AI_ON
+ toggle_ai(AI_ON)
update_icon()
// This snippet of code makes it so that attacks from its minions give it blood.
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm b/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm
index 0480ed6c985e..7ec898bc7c2c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/parasite_tree.dm
@@ -265,7 +265,7 @@
/obj/effect/particle_effect/smoke/parasite_tree/proc/smoke_mob_effect(mob/living/carbon/human/M)
- M.deal_damage(10, WHITE_DAMAGE)
+ M.deal_damage(10, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(prob(15))
M.emote("cough")
if(M.sanity_lost)
@@ -350,7 +350,7 @@
return
var/mob/living/carbon/human/status_holder = owner
var/tree_toxin = status_holder.maxSanity * 0.20
- status_holder.deal_damage(tree_toxin, WHITE_DAMAGE)
+ status_holder.deal_damage(tree_toxin, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(status_holder.sanity_lost || status_holder.stat == DEAD)
qdel(src)
@@ -380,7 +380,7 @@
/datum/status_effect/display/parasite_tree_curse/proc/TransformOverride(mob/living/carbon/human/H)
if(H && H.has_status_effect(/datum/status_effect/display/melting_love_blessing))
to_chat(H, span_warning("You feel the pink slime dissolve your flesh before it becomes wood."))
- H.deal_damage(400, BLACK_DAMAGE)
+ H.deal_damage(270, BLACK_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
H.remove_status_effect(/datum/status_effect/display/melting_love_blessing)
if(!H || H.stat == DEAD)
return TRUE
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm b/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm
index e83116e61e0a..ae9759ed38dd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/pygmalion.dm
@@ -204,17 +204,15 @@
QDEL_IN(src, 5 SECONDS)
..()
-/mob/living/simple_animal/hostile/abnormality/pygmalion/attackby(obj/item/W, mob/user, params)
+/mob/living/simple_animal/hostile/abnormality/pygmalion/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- CounterAttack(user)
-
-/mob/living/simple_animal/hostile/abnormality/pygmalion/bullet_act(obj/projectile/P)
- . = ..()
- CounterAttack(P.firer)
+ if((. <= 0) || (!isliving(source)) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_STATUS | ATTACK_TYPE_ENVIRONMENT)))
+ return
+ CounterAttack(source)
/mob/living/simple_animal/hostile/abnormality/pygmalion/proc/CounterAttack(mob/living/attacker)
if (attacker == sculptor)
- attacker.deal_damage(retaliation, PALE_DAMAGE)
+ attacker.deal_damage(retaliation, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_COUNTER))
to_chat(attacker, span_userdanger("You feel your heart break!"))
/datum/status_effect/sculptor
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm b/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm
index f1acead7d405..ffa7ff69febd 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/red_riding_mercenary.dm
@@ -221,12 +221,15 @@ It has now been over four months. Now we get her for real. -Coxswain
addtimer(CALLBACK(src, PROC_REF(EndEvade)), 20)
return
-/mob/living/simple_animal/hostile/abnormality/red_hood/apply_damage(damage = 0,damagetype = RED_DAMAGE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
+/mob/living/simple_animal/hostile/abnormality/red_hood/PreDamageReaction(damage_amount, damage_type, source, attack_type)
if(evading_attack)
evading_attack = FALSE
EndEvade()
return FALSE
- ..()
+ return TRUE
+
+/mob/living/simple_animal/hostile/abnormality/red_hood/PostDamageReaction(damage_amount, damage_type, source, attack_type)
+ . = ..()
if(health > (maxHealth * 0.8) || !priority_target)
return
if(red_rage < 1 && target_priority > 2)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm b/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm
index 7e3cbc5975a8..f95f453999c4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/rose_sign.dm
@@ -175,7 +175,7 @@
/mob/living/simple_animal/hostile/abnormality/rose_sign/WorktickFailure(mob/living/carbon/human/user)
if(LAZYLEN(work_damages))//are there any children under work damages? Apply all of the damages!
for(var/damtype in work_damages)
- user.deal_damage(work_damages[damtype], damtype)
+ user.deal_damage(work_damages[damtype], damtype, flags = (DAMAGE_FORCED))
return ..()
/mob/living/simple_animal/hostile/abnormality/rose_sign/proc/WorkSpeech(list/lines, list/speech_styles)
@@ -331,7 +331,7 @@
alpha = 1
for(var/mob/living/carbon/human/H in view(3, src))//big, big AOE
grabbed = TRUE
- H.deal_damage(boom_damage, BLACK_DAMAGE)
+ H.deal_damage(boom_damage, BLACK_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if(H.buckled)//Otherwise it would rip people off their crucifixes. Not too exploitable
continue
H.forceMove(get_turf(src))//pulls them all to the target
@@ -363,7 +363,7 @@
for(var/turf/T in view(0, target_turf))
new /obj/effect/temp_visual/thornspike(T)
for(var/mob/living/L in T)
- L.deal_damage(root_damage, damtype)
+ L.deal_damage(root_damage, damtype, attack_type = (ATTACK_TYPE_SPECIAL))
if(L.stat == DEAD)
if(L.has_status_effect(/datum/status_effect/stacking/crownthorns))//Stops a second crucifix from appearing
L.remove_status_effect(STATUS_EFFECT_THORNS)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm b/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm
index 093e9e78055c..175d93e3b920 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/screenwriter.dm
@@ -394,7 +394,7 @@ Defeating the murderer also surpresses the abnormality.
for(var/mob/living/carbon/human/H in view(7, human_pawn))
if(HAS_TRAIT(H, TRAIT_COMBATFEAR_IMMUNE))
continue
- H.deal_damage(sanity_damage, WHITE_DAMAGE)
+ H.deal_damage(sanity_damage, WHITE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
#undef STATUS_EFFECT_ACTOR
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm b/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm
index dd09a44c6a18..ccf61fe13537 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/silence.dm
@@ -82,7 +82,7 @@
continue
new /obj/effect/temp_visual/thirteen(get_turf(H)) //A visual effect if it hits
- H.deal_damage(worldwide_damage, PALE_DAMAGE)
+ H.deal_damage(worldwide_damage, PALE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
addtimer(CALLBACK(src, PROC_REF(Reset)), reset_time)
return
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm b/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm
index 7da7e81af2bc..0e8aaffe57aa 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/siltcurrent.dm
@@ -198,7 +198,7 @@
playsound(L, "sound/abnormalities/dreamingcurrent/bite.ogg", 50, TRUE)
visible_message(span_boldwarning("[src] mauls through [L]!"))
to_chat(L, span_userdanger("[src] mauls you!"))
- HurtInTurf(T, list(), dive_damage, RED_DAMAGE)
+ HurtInTurf(T, list(), dive_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0 || L.stat == DEAD)
L.gib()
SLEEP_CHECK_DEATH(0.5 SECONDS)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm b/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm
index bc5f5c79ce32..e85972b2cf56 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/snow_whites_apple.dm
@@ -168,7 +168,7 @@
if(W.last_expand <= world.time)
W.expand()
else if(nightmare_mode && ranged_cooldown <= world.time)
- var/list/did_we_hit = HurtInTurf(get_turf(W), list(), 30, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ var/list/did_we_hit = HurtInTurf(get_turf(W), list(), 30, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(did_we_hit.len)
W.VineAttack(pick(did_we_hit))
if(teleport_cooldown <= world.time && !togglemovement && !client && !IsCombatMap())
@@ -252,7 +252,7 @@
/mob/living/simple_animal/hostile/abnormality/snow_whites_apple/proc/VineSpike()
playsound(get_turf(src), projectilesound, 30)
for(var/obj/structure/spreading/apple_vine/W in view(vision_range, src))
- var/list/did_we_hit = HurtInTurf(get_turf(W), list(), 10, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ var/list/did_we_hit = HurtInTurf(get_turf(W), list(), 10, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(did_we_hit.len)
W.VineAttack(pick(did_we_hit))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm b/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm
index 7089c78dcbf1..520828befe49 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/sphinx.dm
@@ -272,7 +272,7 @@
playsound(get_turf(src), 'sound/effects/ordeals/brown/rock_attack.ogg', 50, 0, 8)
for(var/turf/T in view(2, src))
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/victim in HurtInTurf(T, list(), quake_damage, WHITE_DAMAGE, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE))
+ for(var/mob/living/victim in HurtInTurf(T, list(), quake_damage, WHITE_DAMAGE, null, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
var/throw_target = get_edge_target_turf(victim, get_dir(victim, get_step_away(victim, src)))
if(!victim.anchored)
var/throw_velocity = (prob(60) ? 1 : 4)
@@ -479,7 +479,7 @@
new /obj/effect/temp_visual/rockattack(target_turf)
for(var/turf/T in view(1, src))
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/L in caster.HurtInTurf(T, list(), damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in caster.HurtInTurf(T, list(), damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_SPECIAL)))
if(L.health < 0)
L.gib()
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm b/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
index b82915649ae6..84a9f25db2f4 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/thunder_bird.dm
@@ -214,7 +214,7 @@
playsound(L, attack_sound, 75, 1)
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/kinetic_blast(LT)
- L.deal_damage(30, BLACK_DAMAGE)
+ L.deal_damage(30, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.electrocute_act(1, src, flags = SHOCK_NOSTUN)
@@ -236,7 +236,7 @@
. = ..()
if(user.health > (user.maxHealth*0.8))
datum_reference.qliphoth_change(1)
- user.deal_damage(10, BLACK_DAMAGE)
+ user.deal_damage(10, BLACK_DAMAGE, flags = (DAMAGE_FORCED))
playsound(src, 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, TRUE)
say(pick(thunder_bird_lines))
user.electrocute_act(1, src, flags = SHOCK_NOSTUN)
@@ -328,7 +328,7 @@
playsound(get_turf(src), 'sound/abnormalities/thunderbird/tbird_bolt.ogg', 50, 0, 8)
var/list/turfs_to_check = view(range, src)
for(var/mob/living/carbon/human/H in turfs_to_check)
- H.deal_damage(boom_damage, BLACK_DAMAGE)
+ H.deal_damage(boom_damage, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
H.electrocute_act(1, src, flags = SHOCK_NOSTUN)
if(H.health < 0)
Convert(H)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm b/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm
index 4208b42422cd..ca9deb353940 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/wrath_servant.dm
@@ -168,7 +168,7 @@
continue
if(istype(L, /mob/living/simple_animal/hostile/azure_hermit) || istype(L, /mob/living/simple_animal/hostile/azure_stave))
continue
- L.deal_damage(30, WHITE_DAMAGE)
+ L.deal_damage(30, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
var/obj/effect/temp_visual/eldritch_smoke/ES = new(get_turf(L))
ES.color = COLOR_GREEN
to_chat(L, span_warning("The Azure hermit's magic being channeled through [src] racks your mind!"))
@@ -267,7 +267,7 @@
if(!isliving(attacked_target) || (get_dist(attacked_target, src) > 1))
return
var/mob/living/L = attacked_target
- L.deal_damage(rand(3, 5), BLACK_DAMAGE)
+ L.deal_damage(rand(3, 5), BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE))
if(!istype(attacked_target, /mob/living/simple_animal/hostile/azure_hermit))
return
var/mob/living/simple_animal/hostile/azure_hermit/AZ = attacked_target
@@ -464,7 +464,7 @@
else
hit_turfs = (view(i, src) - range(i-1, src)) // Respects walls for last 2
for(var/turf/T in hit_turfs)
- been_hit = HurtInTurf(T, been_hit, smash_damage, smash_damage_type, null, TRUE, FALSE, TRUE, FALSE, TRUE)
+ been_hit = HurtInTurf(T, been_hit, smash_damage, smash_damage_type, null, TRUE, FALSE, TRUE, FALSE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/kinetic_blast(T)
if(prob(3))
if(friendly)
@@ -735,7 +735,7 @@
return
if(SW.health > 100)
playsound(SW, 'sound/abnormalities/wrath_servant/hermit_attack_hard.ogg', 75, FALSE, 15, falloff_distance = 5)
- SW.deal_damage(30, WHITE_DAMAGE) // We win these
+ SW.deal_damage(30, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE)) // We win these
var/list/show_area = list()
show_area |= view(3, src)
for(var/turf/sT in show_area)
@@ -747,7 +747,7 @@
var/list/been_hit = list()
for(var/i = 1 to 3)
for(var/turf/T in (view(i, SW)-view(i-1,SW)))
- been_hit = HurtInTurf(T, been_hit, 10, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ been_hit = HurtInTurf(T, been_hit, 10, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
SLEEP_CHECK_DEATH(3)
else
@@ -811,7 +811,7 @@
for(var/mob/living/L in livinginview(4, src))
if(faction_check_mob(L))
continue
- L.deal_damage(15, WHITE_DAMAGE)
+ L.deal_damage(15, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
can_act = TRUE
return
@@ -969,7 +969,7 @@
if(!isliving(owner))
return
var/mob/living/status_holder = owner
- status_holder.deal_damage(1, BLACK_DAMAGE)
+ status_holder.deal_damage(1, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(!ishuman(status_holder))
return
if((status_holder.sanityhealth <= 0) || (status_holder.health <= 0))
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm b/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm
index 29e03a3038f7..ea0a2b938cce 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/yang.dm
@@ -109,35 +109,14 @@
return TRUE
return FALSE
-/mob/living/simple_animal/hostile/abnormality/yang/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE)
- apply_damage(P.damage, P.damage_type)
- P.on_hit(src, 0, piercing_hit)
- if(!P.firer)
- return BULLET_ACT_HIT
- Reflect(P.firer, P.damage)
- return BULLET_ACT_HIT
-
-/mob/living/simple_animal/hostile/abnormality/yang/attacked_by(obj/item/I, mob/living/user)
+/mob/living/simple_animal/hostile/abnormality/yang/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- Reflect(user, I.force)
- return
-
-/mob/living/simple_animal/hostile/abnormality/yang/attack_hand(mob/living/carbon/human/M)
- . = ..()
- Reflect(M, 2)
- return
-
-/mob/living/simple_animal/hostile/abnormality/yang/attack_animal(mob/living/simple_animal/M)
- . = ..()
- Reflect(M, M.melee_damage_upper)
- return
+ if((. <= 0) || !isliving(source) || (attack_type & (ATTACK_TYPE_COUNTER | ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
+ return
+ Reflect(source, .)
/mob/living/simple_animal/hostile/abnormality/yang/proc/Reflect(mob/living/attacker, damage)
- if(ishuman(attacker))
- var/mob/living/carbon/human/H = attacker
- var/justice_mod = 1 + (get_attribute_level(H, JUSTICE_ATTRIBUTE)/100)
- damage *= justice_mod
- attacker.deal_damage(damage, WHITE_DAMAGE)
+ attacker.deal_damage(damage, WHITE_DAMAGE, source = src, attack_type = (ATTACK_TYPE_COUNTER | ATTACK_TYPE_SPECIAL))
return
/mob/living/simple_animal/hostile/abnormality/yang/death()
@@ -186,7 +165,7 @@
if(get_dist(src, T) > i)
continue
new /obj/effect/temp_visual/dir_setting/speedbike_trail(T)
- HurtInTurf(T, list(), explosion_damage, WHITE_DAMAGE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), explosion_damage, WHITE_DAMAGE, hurt_mechs = TRUE, flags = (DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_SPECIAL))
all_turfs -= T
SLEEP_CHECK_DEATH(1)
diff --git a/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm b/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm
index f82781552e09..4c9961f5c4e5 100644
--- a/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/waw/yin.dm
@@ -211,30 +211,14 @@
COOLDOWN_START(src, pulse, pulse_cooldown)
INVOKE_ASYNC(src, PROC_REF(Pulse))
-/mob/living/simple_animal/hostile/abnormality/yin/attacked_by(obj/item/I, mob/living/user)
- . = ..()
- PulseOrLaser(user)
-
-/mob/living/simple_animal/hostile/abnormality/yin/attack_hand(mob/living/carbon/human/M)
- . = ..()
- PulseOrLaser(M)
-
-/mob/living/simple_animal/hostile/abnormality/yin/attack_animal(mob/living/simple_animal/M)
- . = ..()
- PulseOrLaser(M)
-
/mob/living/simple_animal/hostile/abnormality/yin/OpenFire()
FireLaser(target)
-/mob/living/simple_animal/hostile/abnormality/yin/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE)
- apply_damage(P.damage, P.damage_type)
- P.on_hit(src, 0, piercing_hit)
- . = BULLET_ACT_HIT
- if(!P.firer)
- return .
- if(!isliving(P.firer) && !ismecha(P.firer))
- return .
- PulseOrLaser(P.firer)
+/mob/living/simple_animal/hostile/abnormality/yin/PostDamageReaction(damage_amount, damage_type, source, attack_type)
+ . = ..()
+ if(!isliving(source) && !ismecha(source))
+ return
+ PulseOrLaser(source)
/mob/living/simple_animal/hostile/abnormality/yin/AttackingTarget(atom/attacked_target)
return FALSE
@@ -246,7 +230,7 @@
var/list/to_hit = range(i, src) - hit_turfs
hit_turfs |= to_hit
for(var/turf/open/OT in to_hit)
- hit = HurtInTurf(OT, hit, pulse_damage, BLACK_DAMAGE, null, TRUE, faction_override, TRUE)
+ hit = HurtInTurf(OT, hit, pulse_damage, BLACK_DAMAGE, null, TRUE, faction_override, TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/small_smoke/yin_smoke/short(OT)
sleep(3)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm
index 525814ca5e2b..3fec2cfa21a9 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/blubbering_toad.dm
@@ -202,7 +202,7 @@
if(T.density)
break
if(idiot in T)
- idiot.deal_damage(tongue_damage, BLACK_DAMAGE)
+ idiot.deal_damage(tongue_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(idiot), pick(GLOB.alldirs))
if(!idiot.anchored)
var/whack_speed = (prob(60) ? 1 : 4)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm
index 7dcaf8e82243..80bc3315a2fc 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/bottle.dm
@@ -207,7 +207,7 @@
M.apply_status_effect(STATUS_EFFECT_TEARS_LESS)
else
to_chat(M, span_notice("You decide against drinking from the bottle..."))
- M.deal_damage(speak_damage, WHITE_DAMAGE)
+ M.deal_damage(speak_damage, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
eating = FALSE
/mob/living/simple_animal/hostile/abnormality/bottle/ListTargets()
@@ -246,7 +246,7 @@
continue
if(faction_check_mob(L, FALSE))
continue
- L.deal_damage(speak_damage, BLACK_DAMAGE)
+ L.deal_damage(speak_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
adjustBruteLoss(-speak_damage) // It falls further into desperation
if(speak_damage < 40)
speak_damage += 4
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm
index 440e5d9510cb..bd750d9ae5a2 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/fallen_amurdad.dm
@@ -444,7 +444,7 @@
return ..()
damage_mod = LV.toxLethality * 100
metabolization_rate = max(volume * REAGENTS_METABOLISM, REAGENTS_METABOLISM)
- M.deal_damage((volume * REAGENTS_METABOLISM * damage_mod), RED_DAMAGE)
+ M.deal_damage((volume * REAGENTS_METABOLISM * damage_mod), RED_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
if(ishuman(M))
if(DT_PROB(3, 6))
var/mob/living/carbon/human/H = M
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm
index 4867566da999..4292bf9d546b 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/one_sin.dm
@@ -117,7 +117,7 @@
var/obj/effect/temp_visual/onesin_blessing/OB = new(get_turf(WN))
OB.layer = WN.layer + 0.1
OB.pixel_x += rand(-6,6)
- WN.deal_damage(3330, PALE_DAMAGE)//Does 666 damage to WN
+ WN.deal_damage(3330, PALE_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))//Does 666 damage to WN
sleep(5 SECONDS)
for(var/mob/M in GLOB.player_list)
if(M.client)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm
index 225ca0b36535..e18753f2e23c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/oracle.dm
@@ -166,7 +166,7 @@
if(faction_check_mob(L))
continue
to_chat(L, span_userdanger("Visions of a horrible future flash before your eyes!"))
- L.deal_damage((50 - get_dist(src, L)), WHITE_DAMAGE)
+ L.deal_damage((50 - get_dist(src, L)), WHITE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
qdel(src)
/mob/living/simple_animal/hostile/abnormality/oracle/proc/SpecialDreams(datum/oracle_dream/chosen_dream, mob/living/carbon/human/dreamer)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm
index bc413062e047..4da9bdc5d6de 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/pile_of_mail.dm
@@ -82,7 +82,7 @@
/mob/living/simple_animal/hostile/abnormality/mailpile/WorktickFailure(mob/living/carbon/human/user)
if(prob(10))
to_chat(user, span_warning("Ouch! I got a paper cut!"))
- user.deal_damage(1, RED_DAMAGE)
+ user.deal_damage(1, RED_DAMAGE, flags = (DAMAGE_FORCED))
return ..()
/mob/living/simple_animal/hostile/abnormality/mailpile/proc/Delivery(mob/living/carbon/human/user, work_type, pe, work_time)
@@ -445,7 +445,7 @@
/obj/item/mailpaper/trapped/urgent/Trap()
audible_message(span_warning("We are going to kill you."))
for(var/mob/living/carbon/human/H in hearers(7, src))
- H.deal_damage(50, WHITE_DAMAGE)
+ H.deal_damage(50, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
return ..()
/obj/item/mailpaper/trapped/flashbang
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm
index 2e0799be3cdc..66f7e1e60d8c 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/we_can_change_anything.dm
@@ -102,7 +102,7 @@
/mob/living/simple_animal/hostile/abnormality/we_can_change_anything/Worktick(mob/living/carbon/human/user)
if(!sacrifice)
- user.deal_damage(1, RED_DAMAGE) // say goodbye to your kneecaps chucklenuts!
+ user.deal_damage(1, RED_DAMAGE, flags = (DAMAGE_FORCED)) // say goodbye to your kneecaps chucklenuts!
else
do_shaky_animation(1)
playsound(get_turf(src), 'sound/abnormalities/we_can_change_anything/change_generate.ogg', 30, FALSE)
@@ -111,7 +111,7 @@
ramping_speed -= 0.2
if(8 to 20)
ramping_speed -= 0.5
- user.deal_damage(4, RED_DAMAGE) // say goodbye to a bit more than your kneecaps... (total damage is 400 RED).
+ user.deal_damage(4, RED_DAMAGE, flags = (DAMAGE_FORCED)) // say goodbye to a bit more than your kneecaps... (total damage is 400 RED).
total_damage += 4
/mob/living/simple_animal/hostile/abnormality/we_can_change_anything/SpeedWorktickOverride(mob/living/carbon/human/user, work_speed, init_work_speed, work_type)
@@ -202,7 +202,7 @@
sound_cooldown = 0
playsound(src, 'sound/abnormalities/change/change_ding.ogg', 50)
for(var/mob/living/carbon/human/victim in get_turf(src))
- victim.deal_damage(grind_damage, RED_DAMAGE)
+ victim.deal_damage(grind_damage, RED_DAMAGE, src, flags = (DAMAGE_FORCED))
if(victim.health <= 0)
victim.gib()
stoplag(1)
diff --git a/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm b/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm
index 8879866188a8..fad6826eff93 100644
--- a/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm
+++ b/code/modules/mob/living/simple_animal/abnormality/zayin/wellcheers.dm
@@ -216,7 +216,7 @@
if(isnull(damage_type))
return
- owner.deal_damage(debuff_damage, damage_type)
+ owner.deal_damage(debuff_damage, damage_type, attack_type = (ATTACK_TYPE_STATUS))
/atom/movable/screen/alert/status_effect/wellcheers_bad
name = "Shrimp Soda"
diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm
index f7ce46f90ad0..368c2702fe8f 100644
--- a/code/modules/mob/living/simple_animal/animal_defense.dm
+++ b/code/modules/mob/living/simple_animal/animal_defense.dm
@@ -43,7 +43,7 @@
span_userdanger("[M] [response_harm_continuous] you!"), null, COMBAT_MESSAGE_RANGE, M)
to_chat(M, span_danger("You [response_harm_simple] [src]!"))
playsound(loc, attacked_sound, 25, TRUE, -1)
- attack_threshold_check(harm_intent_damage)
+ attack_threshold_check(harm_intent_damage, source = M, attack_type = (ATTACK_TYPE_MELEE))
log_combat(M, src, "attacked")
updatehealth()
return TRUE
@@ -71,7 +71,7 @@
if(..()) //successful monkey bite.
if(stat != DEAD)
var/damage = rand(1, 3)
- attack_threshold_check(damage)
+ attack_threshold_check(damage, source = M, attack_type = (ATTACK_TYPE_MELEE))
return 1
if (M.a_intent == INTENT_HELP)
if (health > 0)
@@ -95,7 +95,7 @@
span_userdanger("You're slashed at by [M]!"), null, COMBAT_MESSAGE_RANGE, M)
to_chat(M, span_danger("You slash at [src]!"))
playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
- attack_threshold_check(damage)
+ attack_threshold_check(damage, source = M, attack_type = (ATTACK_TYPE_MELEE))
log_combat(M, src, "attacked")
return 1
@@ -103,29 +103,36 @@
. = ..()
if(. && stat != DEAD) //successful larva bite
var/damage = rand(5, 10)
- . = attack_threshold_check(damage)
+ . = attack_threshold_check(damage, source = L, attack_type = (ATTACK_TYPE_MELEE))
if(.)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M)
. = ..()
if(.)
- return attack_threshold_check(rand(M.melee_damage_lower, M.melee_damage_upper), M.melee_damage_type) //Fixing a 1 year old bug...
+ return attack_threshold_check(rand(M.melee_damage_lower, M.melee_damage_upper), M.melee_damage_type, source = M, attack_type = (ATTACK_TYPE_MELEE)) //Fixing a 1 year old bug...
/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M)
if(..()) //successful slime attack
var/damage = rand(15, 25)
if(M.is_adult)
damage = rand(20, 35)
- return attack_threshold_check(damage)
+ return attack_threshold_check(damage, source = M, attack_type = (ATTACK_TYPE_MELEE))
/mob/living/simple_animal/attack_drone(mob/living/simple_animal/drone/M)
if(M.a_intent == INTENT_HARM) //No kicking dogs even as a rogue drone. Use a weapon.
return
return ..()
-/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, actuallydamage = TRUE)
+// This proc is significantly more important than it may seem. All melee attacks done by simple_animals on other simple_animals use this.
+// Sadly the damage shuffler has to be accounted for here. We do this using temporary vars, but we won't actually change the vars that we'd send to deal_damage if actuallydamage is true
+// We REALLY need to look into refactoring this.
+/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, actuallydamage = TRUE, source = null, attack_type = null)
var/temp_damage = damage
+ var/temp_damage_type = damagetype
+ var/should_shuffle = GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damagetype)
+ if(should_shuffle)
+ temp_damage_type = GLOB.damage_type_shuffler.mapping_offense[damagetype] // Calls to this proc will be made with the ORIGINAL damage type. We have to do the offensive shuffling here.
if(islist(damage_coeff))
ChangeResistances(damage_coeff)
@@ -137,15 +144,25 @@
unmodified_damage_coeff_datum = makeDamCoeff()
damage_coeff = unmodified_damage_coeff_datum
UpdateResistances()
- temp_damage *= damage_coeff.getCoeff(damagetype)
+
+
+ // Defensive shuffling. If the shuffler is enabled, make sure we're responding to the incoming damage with the correct defense mapping.
+ var/coeff_to_use = damage_coeff.getCoeff(temp_damage_type)
+ if(should_shuffle)
+ var/defensive_damage_type = GLOB.damage_type_shuffler.mapping_defense[temp_damage_type]
+ coeff_to_use = damage_coeff.getCoeff(defensive_damage_type)
+ temp_damage *= coeff_to_use
if(temp_damage >= 0 && temp_damage <= force_threshold)
visible_message(span_warning("[src] looks unharmed!"))
DamageEffect(0, damagetype)
return FALSE
+
+ // This proc isn't just used to "check if you can deal damage". Several instances of its use in the codebase are used to ACTUALLY DEAL DAMAGE.
+ // Since deal_damage will account for the damage shuffler itself, we need to send the ORIGINAL damage and damage types to it, not the temporary ones we were working with here to see if the hit was nullified.
if(actuallydamage)
- apply_damage(damage, damagetype, null, getarmor(null, damagetype))
+ deal_damage(damage, damagetype, source = source, attack_type = attack_type)
return TRUE
/mob/living/simple_animal/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE)
@@ -153,7 +170,7 @@
for(var/i in projectile_blockers)
Proj.impacted[i] = TRUE
Proj.impacted[src] = TRUE
- apply_damage(Proj.damage, Proj.damage_type)
+ deal_damage(Proj.damage, Proj.damage_type, source = Proj.firer, attack_type = (ATTACK_TYPE_RANGED))
Proj.on_hit(src, 0, piercing_hit)
return BULLET_ACT_HIT
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 293e9858a157..048550be45ca 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -179,7 +179,7 @@
playsound(loc, weapon.hitsound, weapon.get_clamped_volume(), TRUE, extrarange = weapon.stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0)
do_attack_animation(C)
- C.apply_damage(1, weapon.damtype, pick(list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)), C.run_armor_check(null, weapon.damtype), FALSE, TRUE)
+ C.deal_damage(1, weapon.damtype, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = pick(list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)))
visible_message(span_warning("[src] nicks [C]!"), span_nicegreen("You steal [C]'s job!"))
/mob/living/simple_animal/bot/cleanbot/attackby(obj/item/W, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 0b9df8fee952..646309b7b616 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -732,12 +732,12 @@
playsound(src, 'sound/effects/splat.ogg', 50, TRUE)
var/damage = rand(5,15)
- H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE))
- H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE))
- H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE))
- H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE))
- H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE))
- H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE))
+ H.deal_damage(2*damage, BRUTE, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_HEAD)
+ H.deal_damage(2*damage, BRUTE, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST)
+ H.deal_damage(0.5*damage, BRUTE, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_L_LEG)
+ H.deal_damage(0.5*damage, BRUTE, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_R_LEG)
+ H.deal_damage(0.5*damage, BRUTE, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_L_ARM)
+ H.deal_damage(0.5*damage, BRUTE, source = src, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_R_ARM)
var/turf/T = get_turf(src)
T.add_mob_blood(H)
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 82b325df7c5b..cea2b61d8e00 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -156,7 +156,7 @@
if(istype(P, /obj/projectile/energy) || istype(P, /obj/projectile/beam))
var/reflectchance = 40 - round(P.damage/3)
if(prob(reflectchance))
- apply_damage(P.damage * 0.5, P.damage_type)
+ deal_damage(P.damage * 0.5, P.damage_type, source = P.firer, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_RANGED))
visible_message("The [P.name] is reflected by [src]'s armored shell!", \
"The [P.name] is reflected by your armored shell!")
diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm
index f6ef206d9f3a..2eed8c29c328 100644
--- a/code/modules/mob/living/simple_animal/damage_procs.dm
+++ b/code/modules/mob/living/simple_animal/damage_procs.dm
@@ -93,3 +93,12 @@
if(GLOB.damage_type_shuffler?.is_enabled)
damage_coeff_value = damage_coeff.getCoeff(GLOB.damage_type_shuffler.mapping_defense[PALE_DAMAGE])
. = adjustHealth(amount * damage_coeff_value * CONFIG_GET(number/damage_multiplier), updating_health, forced)
+
+// This override is used to get the correct amount of damage for PostDamageReaction to use in case of there being a damage shuffle.
+/mob/living/simple_animal/PostDamageReaction(damage_amount, damage_type, source, attack_type)
+ . = damage_amount
+ var/coeff_to_use = damage_coeff.getCoeff(damage_type)
+ if(GLOB.damage_type_shuffler?.is_enabled && IsColorDamageType(damage_type))
+ var/defensive_damage_type = GLOB.damage_type_shuffler.mapping_defense[damage_type]
+ coeff_to_use = damage_coeff.getCoeff(defensive_damage_type)
+ return . * coeff_to_use
diff --git a/code/modules/mob/living/simple_animal/distortion/legend/papa_bongy.dm b/code/modules/mob/living/simple_animal/distortion/legend/papa_bongy.dm
index 9a09cd00445f..7bf72ec5b3a5 100644
--- a/code/modules/mob/living/simple_animal/distortion/legend/papa_bongy.dm
+++ b/code/modules/mob/living/simple_animal/distortion/legend/papa_bongy.dm
@@ -163,7 +163,7 @@
do_attack_animation(target_turf)
for(var/turf/T in range(i, target_turf))
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, melee_damage_lower, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15)
+ been_hit = HurtInTurf(T, been_hit, melee_damage_lower, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(i == 3)
for(var/mob/living/carbon/human/H in T)
H.Knockdown(20)
diff --git a/code/modules/mob/living/simple_animal/distortion/nightmare/distorted_kim.dm b/code/modules/mob/living/simple_animal/distortion/nightmare/distorted_kim.dm
index f0736038c167..1effff4edc7e 100644
--- a/code/modules/mob/living/simple_animal/distortion/nightmare/distorted_kim.dm
+++ b/code/modules/mob/living/simple_animal/distortion/nightmare/distorted_kim.dm
@@ -148,7 +148,7 @@
playsound(src, 'sound/weapons/fixer/generic/finisher2.ogg', 75, TRUE, 2)
for(var/turf/T in range(2, src))
new /obj/effect/temp_visual/smash_effect(T)
- been_hit = HurtInTurf(T, been_hit, counter_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15)
+ been_hit = HurtInTurf(T, been_hit, counter_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, mech_damage = 15, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_COUNTER))
for(var/mob/living/carbon/human/H in T)
H.Knockdown(20)
countering = FALSE
@@ -203,10 +203,10 @@
/mob/living/simple_animal/hostile/distortion/kim/proc/Finisher(mob/living/target) //This is super hard to avoid
- target.apply_damage(10, PALE_DAMAGE, null, target.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE) //10% of your health in red damage
+ target.deal_damage(10, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL), blocked = target.run_armor_check(null, RED_DAMAGE)) //10% of your health in red damage
to_chat(target, span_danger("[src] is trying to cut you in half!"))
if(!ishuman(target))
- target.deal_damage(100, PALE_DAMAGE) //bit more than usual DPS in pale damage
+ target.deal_damage(100, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)) //bit more than usual DPS in pale damage
return
if(target.health > 0)
return
@@ -272,7 +272,7 @@
to_chat(L, span_userdanger("[src] slashes through you!"))
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/slice(LT)
- L.apply_damage(dash_damage,RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(dash_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
been_hit += L
playsound(L, 'sound/distortions/KimBasicSlash.ogg', 75, 1)
if(!ishuman(L))
@@ -434,7 +434,7 @@
return
for(var/turf/T in RANGE_TURFS(1, src))
playsound(src, 'sound/effects/ordeals/white/white_reflect.ogg', min(15 + damage, 100), TRUE, 4)
- attacker.apply_damage(damage, attack_type, null, attacker.getarmor(null, attack_type))
+ attacker.deal_damage(damage, attack_type, src, attack_type = (ATTACK_TYPE_COUNTER))
/mob/living/simple_animal/hostile/distortion/kim/attack_hand(mob/living/carbon/human/M)
. = ..()
@@ -526,7 +526,7 @@
new /obj/effect/temp_visual/small_smoke/halfsecond(TT)
for(var/mob/living/target in TT)
to_chat(target, span_userdanger("\The [src] slashes you!"))
- target.apply_damage(serumA_damage, PALE_DAMAGE, null, target.run_armor_check(null, PALE_DAMAGE))
+ target.deal_damage(serumA_damage, PALE_DAMAGE, src)
new /obj/effect/temp_visual/cleave(target.loc)
playsound(target, 'sound/distortions/kim_bone_claim.ogg', 25, 0, 5)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
index cce03ea6a1b4..5c32bbe41272 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm
@@ -65,7 +65,7 @@
if(!blocked)
L.drop_all_held_items()
L.visible_message(span_danger("[src] slams into [L]!"), span_userdanger("[src] slams into you!"))
- L.apply_damage(20, BRUTE)
+ L.deal_damage(20, BRUTE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, TRUE)
shake_camera(L, 4, 3)
shake_camera(src, 2, 3)
diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
index d840d26cd0c0..81bfc05b02d0 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm
@@ -34,7 +34,7 @@
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
if(L != src && L != summoner)
- L.apply_damage(15, BRUTE)
+ L.deal_damage(15, BRUTE, src, attack_type = (ATTACK_TYPE_MELEE))
new /obj/effect/temp_visual/explosion(get_turf(M))
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 4f28730e9e67..6e40f8a3c195 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -166,7 +166,7 @@
var/obj/structure/beebox/BB = target
forceMove(BB)
toggle_ai(AI_IDLE)
- target = null
+ LoseTarget(FALSE)
wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home
return //no don't attack the goddamm box
else
@@ -193,10 +193,10 @@
/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro)
if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit)
- target = null
+ LoseTarget(FALSE)
return
- target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
+ LoseTarget(FALSE) //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
wanted_objects -= hydroponicstypecache //so we only hunt them while they're alive/seeded/not visisted
Hydro.recent_bee_visit = TRUE
addtimer(VARSET_CALLBACK(Hydro, recent_bee_visit, FALSE), BEE_TRAY_RECENT_VISIT)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 9bcddb1dcfca..525a64ad3e97 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -98,6 +98,10 @@ GLOBAL_LIST_EMPTY(marked_players)
var/ending_looting_line = "That's it, you asked for this."
var/list/glob_faction = list()
+ // When hit without a target, will patrol to the source of the damage (if any) as long as we're not on this cooldown.
+ var/investigation_cooldown
+ var/investigation_cooldown_duration = 20 SECONDS
+
// When this var is TRUE, will not attempt to break out of somewhere it's confined in or buckled to.
var/docile_confinement = FALSE
@@ -275,25 +279,6 @@ GLOBAL_LIST_EMPTY(marked_players)
if(AIStatus == AI_IDLE)
toggle_ai(AI_ON)
FindTarget(list(user), 1)
- var/add_aggro = 0
- var/add_damtype
- if(I)
- add_aggro = I.force
- add_damtype = I.damtype
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- var/justice_mod = 1 + get_modified_attribute_level(H, JUSTICE_ATTRIBUTE) / 100
- add_aggro *= justice_mod
- if(istype(I, /obj/item/ego_weapon/))
- var/obj/item/ego_weapon/EW = I
- add_aggro *= EW.force_multiplier
- else
- //this code does not seem to ever get executed
- add_aggro = user.melee_damage_upper
- if(isanimal(user))
- var/mob/living/simple_animal/A = user
- add_damtype = A.melee_damage_type
- RegisterAggroValue(user, add_aggro, add_damtype)
if(target == user)
GainPatience()
return ..()
@@ -303,11 +288,6 @@ GLOBAL_LIST_EMPTY(marked_players)
if(!target)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
- else
- Goto(P.starting, move_to_delay, 3)
- //register the attacker in our memory.
- if(P.firer)
- RegisterAggroValue(P.firer, P.damage, P.damage_type)
return ..()
/mob/living/simple_animal/hostile/attack_animal(mob/living/simple_animal/M, damage)
@@ -318,9 +298,23 @@ GLOBAL_LIST_EMPTY(marked_players)
if(AIStatus == AI_IDLE)
toggle_ai(AI_ON)
FindTarget(list(M), TRUE)
- RegisterAggroValue(M, damage, M.melee_damage_type)
if(target == M)
GainPatience()
+// This proc will register the aggro value for damage taken by deal_damage. It is called by /hostile/deal_damage() which is an override of mob/living/proc/deal_damage().
+/mob/living/simple_animal/hostile/proc/RegisterAttackAggro(damage_amount, damage_type, source)
+ if(!damage_amount || stat >= DEAD || client)
+ return
+ if(isliving(source) && !faction_check_mob(source)) // If a mob is responsible for the damage we took... (Mind, we will receive source = null for attacks that are not intended to be "trackable")
+ var/mob/living/source_of_damage = source
+ if(source_of_damage.status_flags & GODMODE) // Let's not aggro on things we can't hurt anyhow
+ return
+ RegisterAggroValue(source, damage_amount, damage_type) // Regardless of whether we have an active target or not, add the damage taken to our target memory.
+ if(!target && world.time >= investigation_cooldown) // If we don't have a target right now, move to investigate the source of the damage.
+ var/turf/source_turf = get_turf(source)
+ if(!source_turf)
+ return
+ investigation_cooldown = world.time + investigation_cooldown_duration
+ INVOKE_ASYNC(src, TYPE_PROC_REF(/mob/living/simple_animal/hostile, patrol_to), source_turf) // This is an ASync because it calls AStar and that calls stoplag so if you ever have deal_damage in a signal it will throw a warning
/mob/living/simple_animal/hostile/Move(atom/newloc, dir , step_x , step_y)
if(dodging && approaching_target && prob(dodge_prob) && moving_diagonally == 0 && isturf(loc) && isturf(newloc))
@@ -351,12 +345,16 @@ GLOBAL_LIST_EMPTY(marked_players)
. = ..()
if(!ckey && !stat && search_objects < 3 && . > 0)//Not unconscious, and we don't ignore mobs
if(search_objects)//Turn off item searching and ignore whatever item we were looking at, we're more concerned with fight or flight
- target = null
+ LoseTarget(FALSE)
LoseSearchObjects()
if(AIStatus != AI_ON && AIStatus != AI_OFF)
toggle_ai(AI_ON)
FindTarget()
+/mob/living/simple_animal/hostile/deal_damage(damage_amount, damage_type, source = null, flags = null, attack_type = null, blocked = null, def_zone = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE)
+ . = ..() // Returns the final damage, post reductions
+ RegisterAttackAggro(., damage_type, flags & DAMAGE_UNTRACKABLE ? null : source)
+
/mob/living/simple_animal/hostile/death(gibbed)
target_memory.Cut()
attack_is_on_cooldown = FALSE
@@ -752,8 +750,11 @@ GLOBAL_LIST_EMPTY(marked_players)
. += fraction_hp_lost_to_thing * 25
/mob/living/simple_animal/hostile/proc/GiveTarget(atom/new_target)
- target_memory.Cut()
if(!QDELETED(new_target))
+ var/signal_return = SEND_SIGNAL(src, COMSIG_HOSTILE_GAINEDTARGET, new_target)
+ if(signal_return & COMPONENT_HOSTILE_REFUSE_AGGRO) // We can be told to cancel our re-targeting
+ return
+ target_memory.Cut()
target = new_target
target_memory[target] = 0
GainPatience()
@@ -763,11 +764,12 @@ GLOBAL_LIST_EMPTY(marked_players)
LoseTarget()
return FALSE
-/mob/living/simple_animal/hostile/proc/LoseTarget()
+/mob/living/simple_animal/hostile/proc/LoseTarget(stop_movement = TRUE)
target = null
approaching_target = FALSE
in_melee = FALSE
- walk(src, 0)
+ if(stop_movement)
+ walk(src, 0)
SEND_SIGNAL(src, COMSIG_HOSTILE_LOSTTARGET)
LoseAggro()
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index 6270a200c639..6c02c7062ca3 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -139,7 +139,7 @@
/mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A)
face_atom(A)
- target = A
+ FindTarget(list(A), TRUE)
if(!isturf(loc))
return
if(next_move > world.time)
diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
index 7b32482bb113..a5b7ad351c8b 100644
--- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm
@@ -69,7 +69,7 @@
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M)
if(!M)
return 0
- target = null //Target was our mecha, so null it out
+ LoseTarget(FALSE) //Target was our mecha, so null it out
M.aimob_enter_mech(src)
targets_from = M
allow_movement_on_non_turfs = TRUE //duh
@@ -104,7 +104,7 @@
var/search_aggressiveness = 2
for(var/obj/vehicle/sealed/mecha/combat/C in range(vision_range,src))
if(is_valid_mecha(C))
- target = C
+ FindTarget(list(C), TRUE)
search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS!
break
search_objects = search_aggressiveness
@@ -188,7 +188,7 @@
return
else
if(!CanAttack(M))
- target = null
+ LoseTarget(FALSE)
return
return target.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index a4a8bfa708d6..d6c1fe6176f3 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -261,7 +261,7 @@ Difficulty: Hard
to_chat(L, span_userdanger("[src] rends you!"))
playsound(T, attack_sound, 100, TRUE, -1)
var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
- L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, MELEE, null, null, armour_penetration), wound_bonus = CANT_WOUND)
+ L.deal_damage(10, BRUTE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL), def_zone = limb_to_hit, blocked = L.run_armor_check(limb_to_hit, MELEE, null, null, armour_penetration), wound_bonus = CANT_WOUND)
SLEEP_CHECK_DEATH(3)
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
@@ -484,7 +484,7 @@ Difficulty: Hard
var/mob/living/L = A
L.visible_message(span_danger("[src] slams into [L]!"), span_userdanger("[src] tramples you into the ground!"))
src.forceMove(get_turf(L))
- L.apply_damage(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination) ? 15 : 30, BRUTE, wound_bonus = CANT_WOUND)
+ L.deal_damage(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination) ? 15 : 30, BRUTE, src, attack_type = (ATTACK_TYPE_MELEE), wound_bonus = CANT_WOUND)
playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, TRUE)
shake_camera(L, 4, 3)
shake_camera(src, 2, 3)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 3177b4639bba..dbbf5f8323ea 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -302,7 +302,7 @@
if(stat || swooping)
return
if(manual_target)
- target = manual_target
+ FindTarget(list(manual_target), TRUE)
if(!target)
return
stop_automated_movement = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 3bebacd154e1..094246da7a91 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -686,7 +686,7 @@ Difficulty: Hard
to_chat(L, span_userdanger("You're struck by a [name]!"))
var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
var/armor = L.run_armor_check(limb_to_hit, MELEE, "Your armor absorbs [src]!", "Your armor blocks part of [src]!", FALSE, 50, "Your armor was penetrated by [src]!")
- L.apply_damage(damage, FIRE, limb_to_hit, armor, wound_bonus=CANT_WOUND)
+ L.deal_damage(damage, FIRE, caster, def_zone = limb_to_hit, blocked = armor, wound_bonus = CANT_WOUND)
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L //mobs find and damage you...
if(H.stat == CONSCIOUS && !H.target && H.AIStatus != AI_OFF && !H.client)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 4dc74c219247..f2b0bdc949ad 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -138,7 +138,7 @@
. = ..()
if(istype(hit_atom))
playsound(src, attack_sound, 100, TRUE)
- hit_atom.apply_damage(22 * size / 2, wound_bonus = CANT_WOUND) //It gets pretty hard to dodge the skulls when there are a lot of them. Scales down with size
+ hit_atom.deal_damage(22 * size / 2, BRUTE, src, wound_bonus = CANT_WOUND) //It gets pretty hard to dodge the skulls when there are a lot of them. Scales down with size
hit_atom.safe_throw_at(get_step(src, get_dir(src, hit_atom)), 2) //Some knockback. Prevent the legion from melee directly after the throw.
//TURRETS
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index fa6c4ce79523..8e241249622f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -80,7 +80,7 @@
for(var/i = 1 to nest_range)
closest = get_step(closest, get_dir(closest, src))
forceMove(closest) // someone teleported out probably and the megafauna kept chasing them
- target = null
+ LoseTarget(FALSE)
return
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
index b91facc5473e..1871bab18834 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
@@ -151,7 +151,7 @@ Difficulty: Hard
to_chat(L, span_userdanger("[src]'s ground slam shockwave sends you flying!"))
var/turf/thrownat = get_ranged_target_turf_direct(src, L, 8, rand(-10, 10))
L.throw_at(thrownat, 8, 2, src, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
- L.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND)
+ L.deal_damage(20, BRUTE, src, wound_bonus = CANT_WOUND)
shake_camera(L, 2, 1)
all_turfs -= T
sleep(delay)
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index b9c4b8d96808..74af3a4efcdb 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -122,7 +122,7 @@
if(ishuman(attacked_target))
var/mob/living/carbon/human/L = attacked_target
if(L.sanity_lost && L.stat != DEAD)
- L.apply_damage(scream_damage, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE))
+ L.deal_damage(scream_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE))
return ..()
/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
@@ -134,7 +134,7 @@
manual_emote("twitches unnaturally...")
for(var/mob/living/L in view(7, src))
if(!faction_check_mob(L))
- L.apply_damage(scream_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(scream_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/netherworld/migo/Life()
..()
@@ -146,7 +146,7 @@
manual_emote("twitches unnaturally...")
for(var/mob/living/L in view(7, src))
if(!faction_check_mob(L))
- L.apply_damage(scream_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(scream_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/netherworld/blankbody
name = "blank body"
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dawn.dm
index 127301c0d2ac..9602cc6595de 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dawn.dm
@@ -153,7 +153,7 @@
animate(D, alpha = 0, transform = matrix()*1.5, time = 5)
for(var/mob/living/L in target_turf)
if(!faction_check_mob(L))
- L.apply_damage(5, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(5, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
burrow_cooldown = world.time + burrow_cooldown_time
burrowing = FALSE
@@ -354,7 +354,7 @@
var/bug_spawned = feeding_stage + 2 //Should go 3,4,5 bugs then explode, for a total of 12 bugs per body over 4.5 minutes.
feeding_duration = world.time + (feeding_interval)
feeding_stage++
- H.apply_damage(feeding_stage * 3, RED_DAMAGE, null, H.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(feeding_stage * 3, RED_DAMAGE, flags = (DAMAGE_FORCED))
visible_message(span_danger("[feeding_stage] bugs eat their way out of [H]'s body!"))
playsound(get_turf(src), 'sound/effects/ordeals/amber/dawn_dig_out.ogg', 25, 1)
if(H.stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dusk.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dusk.dm
index 061d17cddfc8..32ca6c18ff3c 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dusk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/amber/dusk.dm
@@ -184,7 +184,7 @@
animate(D, alpha = 0, transform = matrix()*1.5, time = 5)
for(var/mob/living/L in view(1, src))
if(!faction_check_mob(L))
- L.apply_damage(25, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(25, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
burrow_cooldown = world.time + burrow_cooldown_time
burrowing = FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/amber/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/amber/midnight.dm
index 11d438311536..21e5e1c9d75c 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/amber/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/amber/midnight.dm
@@ -143,7 +143,7 @@
if(faction_check_mob(L))
continue
var/distance_decrease = get_dist(src, L) * 40
- L.apply_damage((400 - distance_decrease), RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage((400 - distance_decrease), RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
SLEEP_CHECK_DEATH(5)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm
index 775c30b00c7e..b80a8292a43a 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/brown/dawn.dm
@@ -80,7 +80,7 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(jump_damage, melee_damage_type)
+ L.deal_damage(jump_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
continue
@@ -129,7 +129,7 @@
devour(L)
return
new /obj/effect/temp_visual/damage_effect/rupture(get_turf(L))
- L.deal_damage(rupture_damage, BRUTE)
+ L.deal_damage(rupture_damage, BRUTE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE))
else
devour(L)
@@ -218,13 +218,13 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(damage_dealt, melee_damage_type)
+ L.deal_damage(damage_dealt, melee_damage_type, src)
new /obj/effect/temp_visual/damage_effect/sinking(get_turf(L))
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.adjustSanityLoss(sinking_damage)
else
- L.deal_damage(sinking_damage, melee_damage_type)
+ L.deal_damage(sinking_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/obj/vehicle/sealed/mecha/V in T)
V.take_damage(damage_dealt, melee_damage_type)
SLEEP_CHECK_DEATH(8)
@@ -351,7 +351,7 @@
L.visible_message(span_warning("[src] shreds [L] as it passes by!"), span_boldwarning("[src] shreds you!"))
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/kinetic_blast(LT)
- L.apply_damage(dash_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(dash_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
been_hit += L
playsound(L, 'sound/weapons/fixer/generic/sword4.ogg', 75, 1)
if(!ishuman(L))
@@ -463,7 +463,7 @@
Beam(T, "tentacle", time = 10)
playsound(src, 'sound/weapons/ego/censored1.ogg', 75, FALSE, 5)
for(var/turf/TT in turf_list)
- for(var/mob/living/L in HurtInTurf(TT, list(), ability_damage, melee_damage_type, null, TRUE, FALSE, TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(TT, list(), ability_damage, RED_DAMAGE, null, TRUE, FALSE, TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL)))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), pick(GLOB.alldirs))
L.apply_lc_bleed(15)
can_act = TRUE
@@ -579,7 +579,7 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.apply_lc_burn(burn_stacks)
- L.deal_damage(charge_damage, melee_damage_type)
+ L.deal_damage(charge_damage, melee_damage_type, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
playsound(src, 'sound/effects/ordeals/brown/tentacle_explode.ogg', 75, 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/brown/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/brown/noon.dm
index f77380e30909..d85cff3b9edf 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/brown/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/brown/noon.dm
@@ -88,9 +88,9 @@
ReleaseGrab()
return
do_attack_animation(get_step(src, dir), no_effect = TRUE)
- grab_victim.deal_damage(melee_damage_upper, RED_DAMAGE)
+ grab_victim.deal_damage(melee_damage_upper, RED_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/damage_effect/rupture(get_turf(src))
- grab_victim.deal_damage(rupture_damage, BRUTE)
+ grab_victim.deal_damage(rupture_damage, BRUTE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
grab_victim.Immobilize(10)
playsound(get_turf(src), 'sound/effects/ordeals/brown/flower_attack.ogg', 50, 0, 7)
playsound(get_turf(src), 'sound/effects/ordeals/brown/flower_kill.ogg', 50, 0, 7)
@@ -101,10 +101,10 @@
if(4) //Apply double damage
playsound(get_turf(src), 'sound/effects/wounds/crackandbleed.ogg', 200, 0, 7)
to_chat(grab_victim, span_userdanger("It hurts so much!"))
- grab_victim.deal_damage(rupture_damage, BRUTE)
+ grab_victim.deal_damage(rupture_damage, BRUTE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
else //Apply ramping damage
playsound(get_turf(src), 'sound/effects/wounds/crackandbleed.ogg', 200, 0, 7)
- grab_victim.deal_damage((rupture_damage * (3 - count)), BRUTE)
+ grab_victim.deal_damage((rupture_damage * (3 - count)), BRUTE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
count += 1
if(grab_victim.sanity_lost) //This should prevent weird things like panics running away halfway through
grab_victim.Stun(10) //Immobilize does not stop AI controllers from moving, for some reason.
@@ -121,10 +121,10 @@
ReleaseGrab()
return ..()
-/mob/living/simple_animal/hostile/ordeal/sin_gluttony/noon/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/ordeal/sin_gluttony/noon/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(grab_victim)
- release_damage = clamp(release_damage + damage, 0, release_threshold)
+ release_damage = clamp(release_damage + ., 0, release_threshold)
if(release_damage >= release_threshold)
ReleaseGrab()
@@ -174,13 +174,13 @@
for(var/mob/living/L in T)
if(faction_check_mob(L))
continue
- L.deal_damage(damage_dealt, melee_damage_type)
+ L.deal_damage(damage_dealt, melee_damage_type, src, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/damage_effect/sinking(get_turf(L))
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.adjustSanityLoss(sinking_damage)
else
- L.deal_damage(sinking_damage, WHITE_DAMAGE)
+ L.deal_damage(sinking_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/obj/vehicle/sealed/mecha/V in T)
V.take_damage(damage_dealt, melee_damage_type)
SLEEP_CHECK_DEATH(8)
@@ -264,5 +264,5 @@
if(ishuman(L))
var/mob/living/carbon/human/H = L
H.apply_lc_burn(floor(burn_stacks * 0.5))
- L.apply_damage(charge_damage * 0.4, melee_damage_type, null, L.run_armor_check(null, melee_damage_type), spread_damage = TRUE)
+ L.deal_damage(charge_damage * 0.40, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(L, 'sound/effects/ordeals/brown/cromer_slam.ogg', 75, 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dawn.dm
index 73ef2fa6d8a6..50fa4f57f12f 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dawn.dm
@@ -100,5 +100,5 @@
visible_message(span_danger("[src] suddenly explodes!"))
for(var/mob/living/L in view(5, src))
if(!faction_check_mob(L))
- L.apply_damage(10, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(10, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
gib()
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dusk.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dusk.dm
index 17a17194e87d..ed35e74ec59a 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dusk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/dusk.dm
@@ -130,7 +130,7 @@
to_chat(L, span_userdanger("[src] rolls past you!"))
var/turf/LT = get_turf(L)
new /obj/effect/temp_visual/kinetic_blast(LT)
- L.apply_damage(20, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(20, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(!(L in been_hit))
been_hit += L
addtimer(CALLBACK(src, PROC_REF(do_roll), move_dir, (times_ran + 1)), 1.5)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/midnight.dm
index 495c9cb324a8..299d3019da27 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/crimson/midnight.dm
@@ -76,7 +76,7 @@
B.bloodiness = 100
for(var/mob/living/L in view(5, src))
if(!faction_check_mob(L))
- L.apply_damage(200, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(200, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
gib()
/mob/living/simple_animal/hostile/ordeal/crimson_tent/AttackingTarget(atom/attacked_target)
@@ -183,7 +183,7 @@
continue
if (L == src)
continue
- L.apply_damage(bite_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(bite_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE))
SLEEP_CHECK_DEATH(0.5 SECONDS)
can_act = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/event/christmas/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/event/christmas/dawn.dm
index 1073b3442967..c3da782a4e29 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/event/christmas/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/event/christmas/dawn.dm
@@ -89,7 +89,7 @@
for(var/mob/living/L in range(15, target_c))
if(faction_check_mob(L))
continue
- L.apply_damage(10, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(10, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
for(var/obj/machinery/computer/abnormality/A in urange(15, target_c))
if(A.can_meltdown && !A.meltdown && A.datum_reference && A.datum_reference.current && A.datum_reference.qliphoth_meter)
A.datum_reference.qliphoth_change(pick(-999))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/event/whale/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/event/whale/noon.dm
index ae7a1cd5fdc7..364eb477a7fc 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/event/whale/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/event/whale/noon.dm
@@ -80,7 +80,7 @@
for(var/mob/living/carbon/human/H in view(8, src))
if(H.z != z)
continue
- H.deal_damage(pulse_damage, WHITE_DAMAGE)
+ H.deal_damage(pulse_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
H.stuttering = 20
if(H.sanity_lost)
H.SanityLossEffect(PRUDENCE_ATTRIBUTE)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm
index b28790c0d4f7..2956a268e314 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/dusk.dm
@@ -79,7 +79,7 @@
/mob/living/simple_animal/hostile/ordeal/centipede_corrosion/proc/PulseHit(turf/T)
new /obj/effect/temp_visual/smash_effect(T)
- HurtInTurf(T, list(), 3, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), 3, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/mob/living/simple_animal/hostile/ordeal/thunderbird_corrosion/TB in T)
if(TB.charge_level >= TB.charge_level_cap)
continue
@@ -113,7 +113,7 @@
return FALSE
..()
-/mob/living/simple_animal/hostile/ordeal/centipede_corrosion/apply_damage(damage = 0,damagetype = RED_DAMAGE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = SHARP_NONE, white_healable = FALSE)
+/mob/living/simple_animal/hostile/ordeal/centipede_corrosion/deal_damage(damage_amount, damage_type, source, flags, attack_type, blocked, def_zone, wound_bonus, bare_wound_bonus, sharpness)
if(!can_act) //Prevents killing during recharge
return FALSE
..()
@@ -339,10 +339,10 @@
found_radio = TRUE
if(!faction_check_mob(L))
if(found_radio) //You can take off your radio to reduce the damage
- L.deal_damage(4, WHITE_DAMAGE)
+ L.deal_damage(4, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
L.playsound_local(get_turf(L), "[radio_sound]",100)
to_chat(L,span_danger("You hear unsettling sounds come out of your radio!"))
- L.deal_damage(2, WHITE_DAMAGE)
+ L.deal_damage(2, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/ordeal/KHz_corrosion/proc/Screech()
if(screech_cooldown > world.time)
@@ -363,7 +363,7 @@
return
var/list/been_hit = list()
for(var/turf/T in view(7, src))
- HurtInTurf(T, been_hit, 10, WHITE_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE)
+ HurtInTurf(T, been_hit, 10, WHITE_DAMAGE, null, TRUE, FALSE, TRUE, hurt_hidden = TRUE, attack_type = (ATTACK_TYPE_SPECIAL))
sleep(3)
if(QDELETED(src) || stat == DEAD)
if(!QDELETED(src))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm
index 5a8ed90bdfe5..3c73d3c07524 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/midnight.dm
@@ -57,7 +57,7 @@
if(faction_check_mob(L))
continue
var/dealt_damage = max(6, symphony_damage - round(get_dist(src, L) * 0.1))
- L.deal_damage(dealt_damage, WHITE_DAMAGE)
+ L.deal_damage(dealt_damage, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED | DAMAGE_UNTRACKABLE), attack_type = (ATTACK_TYPE_SPECIAL))
if(world.time >= next_movement_time) // Next movement
var/movement_volume = 50
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm
index 35517716a46b..59ffee5152ae 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/gold/noon.dm
@@ -164,7 +164,7 @@
continue
if (L == src)
continue
- HurtInTurf(T, list(), slash_damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), slash_damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE))
SLEEP_CHECK_DEATH(0.5 SECONDS)
can_act = TRUE
@@ -202,7 +202,7 @@
SLEEP_CHECK_DEATH(12)
for(var/turf/T in view(2, src))
new /obj/effect/temp_visual/smash_effect(T)
- for(var/mob/living/L in HurtInTurf(T, list(), sweep_damage, PALE_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), sweep_damage, PALE_DAMAGE, null, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
if(L.health < 0)
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -321,7 +321,7 @@
SLEEP_CHECK_DEATH(3)
TH.attack_animal(src)
for(var/mob/living/carbon/human/H in view(7, get_turf(src)))
- H.deal_damage(7, WHITE_DAMAGE)
+ H.deal_damage(7, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if(!targets_from.Adjacent(TH) || QDELETED(TH) || TH.health > 0)
finishing = FALSE
return
@@ -420,4 +420,4 @@
if(damagetype == WHITE_DAMAGE)
return
var/damage_amt = H.maxSanity * (damage/100) //Deals white the same way pale is dealt
- H.deal_damage(damage_amt, WHITE_DAMAGE)
+ H.deal_damage(damage_amt, WHITE_DAMAGE, attack_type = (ATTACK_TYPE_STATUS))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/green/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/green/dawn.dm
index 4021bf7b7899..08d1738c1f46 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/green/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/green/dawn.dm
@@ -68,7 +68,7 @@
SLEEP_CHECK_DEATH(3)
TH.attack_animal(src)
for(var/mob/living/carbon/human/H in view(7, get_turf(src)))
- H.apply_damage(3, WHITE_DAMAGE, null, H.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(3, WHITE_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
if(!targets_from.Adjacent(TH) || QDELETED(TH) || TH.health > 0)
finishing = FALSE
return
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/green/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/green/midnight.dm
index 69b0db1cb83f..1166fb07ee59 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/green/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/green/midnight.dm
@@ -102,10 +102,8 @@
QDEL_NULL(B)
return ..()
-/mob/living/simple_animal/hostile/ordeal/green_midnight/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/ordeal/green_midnight/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
- if(stat == DEAD)
- return
if(health <= next_health_mark)
next_health_mark -= maxHealth * 0.1
max_lasers += 2
@@ -235,7 +233,7 @@
if(faction_check_mob(L))
continue
already_hit += L
- L.apply_damage(laser_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(laser_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(0.25 SECONDS)
StopLaser()
@@ -287,7 +285,7 @@
playsound(src, 'sound/weapons/fixer/generic/rcorp4.ogg', 15, FALSE, 4)
for(var/mob/living/H in src.loc)
if(!faction_check(H.faction, list("green_ordeal")))
- H.apply_damage(25, BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE))
+ H.deal_damage(25, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
to_chat(H, span_userdanger("You're hit by [src.name]!"))
/// This laser hits in a 3 tile radius (the epicenter and its adjacent tiles).
@@ -317,7 +315,7 @@
var/distance = get_dist(src, H)
if(distance < 2)
if(!faction_check(H.faction, list("green_ordeal")))
- H.apply_damage(50, BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE))
+ H.deal_damage(50, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
to_chat(H, span_userdanger("You're hit by [src.name]!"))
shake_camera(H, 3, 1.5)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/green/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/green/noon.dm
index 71a8d336f687..6aa15aca5b1c 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/green/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/green/noon.dm
@@ -89,7 +89,7 @@
if(!T)
return
new /obj/effect/temp_visual/saw_effect(T)
- HurtInTurf(T, list(), 4, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), 4, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_MELEE))
SLEEP_CHECK_DEATH(1)
/mob/living/simple_animal/hostile/ordeal/green_bot_big/spawn_gibs()
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/indigo/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/indigo/midnight.dm
index 427e5bdb69df..6d0890d66397 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/indigo/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/indigo/midnight.dm
@@ -209,7 +209,7 @@
var/distance = round(get_dist(src, L))
if(distance <= 10)
continue
- L.apply_damage(((pulse_damage + distance - 10)*0.5), BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(((pulse_damage + distance - 10)*0.5), BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/ordeal/indigo_midnight/proc/phase2()
icon_state = "phasechange"
@@ -266,7 +266,7 @@
to_chat(L, span_userdanger("[src]'s ground slam shockwave sends you flying!"))
var/turf/thrownat = get_ranged_target_turf_direct(src, L, 8, rand(-10, 10))
L.throw_at(thrownat, 8, 2, src, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
- L.apply_damage(slam_damage, RED_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(slam_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
shake_camera(L, 2, 1)
all_turfs -= T
sleep(delay)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/steel/dusk.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/steel/dusk.dm
index cad80a395fa0..4e12905a35e2 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/steel/dusk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/steel/dusk.dm
@@ -134,4 +134,4 @@
new /obj/effect/temp_visual/screech(get_turf(src))
for(var/mob/living/L in oview(10, src))
if(!faction_check_mob(L))
- L.apply_damage(40, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(40, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/steel/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/steel/noon.dm
index dceaf8a14128..2be53020b30f 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/steel/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/steel/noon.dm
@@ -32,7 +32,7 @@
new /obj/effect/temp_visual/explosion(get_turf(src))
playsound(loc, 'sound/effects/ordeals/steel/gcorp_boom.ogg', 60, TRUE)
for(var/mob/living/L in ohearers(3, src))
- L.apply_damage(20, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(20, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
//Buff allies, all of these buffs only activate once.
//Buff the grunts around you when you die
@@ -101,7 +101,7 @@
ArialSupport()
else
visible_message(span_notice("[src] crashes to the ground."))
- apply_damage(30, RED_DAMAGE, null, run_armor_check(null, RED_DAMAGE))
+ deal_damage(30, RED_DAMAGE, flags = (DAMAGE_FORCED))
//return to the ground
density = TRUE
layer = initial(layer)
@@ -128,7 +128,7 @@
/mob/living/simple_animal/hostile/ordeal/steel_dawn/steel_noon/flying/proc/SweepAttack(mob/living/sweeptarget)
sweeptarget.visible_message(span_danger("[src] slams into [sweeptarget]!"), span_userdanger("[src] slams into you!"))
- sweeptarget.apply_damage(10, RED_DAMAGE, null, run_armor_check(null, RED_DAMAGE))
+ sweeptarget.deal_damage(10, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 50, TRUE)
if(sweeptarget.mob_size <= MOB_SIZE_HUMAN)
DoKnockback(sweeptarget, src, get_dir(src, sweeptarget))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/violet/dawn.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/violet/dawn.dm
index 29f378c04bf1..e8ff5b2d01c0 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/violet/dawn.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/violet/dawn.dm
@@ -74,7 +74,7 @@
for(var/mob/living/L in view(2, src))
if(!faction_check_mob(L))
new /obj/effect/temp_visual/revenant(get_turf(L))
- L.apply_damage(2, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(2, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED))
return TRUE
/mob/living/simple_animal/hostile/ordeal/violet_fruit/proc/ReleaseDeathGas()
@@ -91,7 +91,7 @@
for(var/mob/living/L in livinginrange(15, target_c))
if(faction_check_mob(L))
continue
- L.apply_damage(12, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(12, WHITE_DAMAGE, flags = (DAMAGE_FORCED))
for(var/obj/machinery/computer/abnormality/A in urange(15, target_c))
if(A.can_meltdown && !A.meltdown && A.datum_reference && A.datum_reference.current && A.datum_reference.qliphoth_meter)
A.datum_reference.qliphoth_change(pick(-999))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/violet/midnight.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/violet/midnight.dm
index 1631f9738b4b..3580916c222a 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/violet/midnight.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/violet/midnight.dm
@@ -52,7 +52,7 @@
/mob/living/simple_animal/hostile/ordeal/violet_midnight/Move()
return FALSE
-/mob/living/simple_animal/hostile/ordeal/violet_midnight/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, white_healable)
+/mob/living/simple_animal/hostile/ordeal/violet_midnight/PostDamageReaction(damage_amount, damage_type, source, attack_type)
. = ..()
if(health < retaliation_health)
retaliation_health -= maxHealth * 0.2
@@ -173,7 +173,7 @@
if(!CanAttack(L))
continue
been_hit += L
- L.apply_damage(attack_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(attack_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(0.1)
/mob/living/simple_animal/hostile/ordeal/violet_midnight/white
@@ -264,7 +264,7 @@
if(!CanAttack(L))
continue
been_hit += L
- L.apply_damage(attack_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(attack_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
/mob/living/simple_animal/hostile/ordeal/violet_midnight/black
icon_state = "violet_midnightb"
@@ -343,7 +343,7 @@
if(!CanAttack(L))
continue
been_hit += L
- L.apply_damage(attack_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(attack_damage, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(0.05)
/obj/effect/black_portal
@@ -435,7 +435,7 @@
for(var/mob/living/L in T)
if(!CanAttack(L))
continue
- L.apply_damage(pulse_damage, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE))
+ L.deal_damage(pulse_damage, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_SPECIAL))
has_targets = TRUE
var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(get_turf(eye), eye)
animate(D, alpha = 0, transform = matrix()*1.25, time = 4)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/violet/noon.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/violet/noon.dm
index 2faa31e9cf25..638ba9c65212 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/violet/noon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/violet/noon.dm
@@ -37,7 +37,7 @@
for(var/mob/living/L in view(2, src))
if(!faction_check_mob(L))
new /obj/effect/temp_visual/revenant(get_turf(L))
- L.apply_damage(3, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(3, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED))
/mob/living/simple_animal/hostile/ordeal/violet_monolith/death(gibbed)
density = FALSE
@@ -61,7 +61,7 @@
for(var/mob/living/L in view(4, src))
if(!faction_check_mob(L))
var/distance_decrease = get_dist(src, L) * 10
- L.apply_damage((60 - distance_decrease), RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage((60 - distance_decrease), RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
SLEEP_CHECK_DEATH(5)
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/white/fixers.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/white/fixers.dm
index 52aceb3728c1..d3edd7eae74e 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/white/fixers.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/white/fixers.dm
@@ -87,7 +87,7 @@
if(faction_check_mob(L))
continue
new /obj/effect/temp_visual/revenant(get_turf(L))
- L.apply_damage(pulse_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(pulse_damage, BLACK_DAMAGE, src, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
SLEEP_CHECK_DEATH(5.6) // In total we wait for 2.8 seconds
playsound(src, 'sound/effects/ordeals/white/black_ability_end.ogg', 100, FALSE, 30)
for(var/obj/machinery/computer/abnormality/A in urange(current_pulse_range, src))
@@ -120,7 +120,7 @@
break
for(var/turf/open/TT in RANGE_TURFS(1, T))
new /obj/effect/temp_visual/small_smoke/halfsecond(TT)
- been_hit = HurtInTurf(TT, been_hit, hammer_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE)
+ been_hit = HurtInTurf(TT, been_hit, hammer_damage, BLACK_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
sleep(1)
SLEEP_CHECK_DEATH(4)
busy = FALSE
@@ -211,13 +211,6 @@
return
return ..()
-/mob/living/simple_animal/hostile/ordeal/white_fixer/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0)
- damage_taken += .
- if(damage_taken >= 240 && !damage_reflection)
- StartReflecting()
-
/mob/living/simple_animal/hostile/ordeal/white_fixer/proc/LongBeam(target)
if(beam_cooldown > world.time)
return
@@ -255,7 +248,7 @@
affected_turfs += TT
var/obj/effect/reusable_visual/RV = RVP.NewSmoke(TT, 5 SECONDS)
RV.name = "mental smoke"
- been_hit = HurtInTurf(TT, been_hit, beam_direct_damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ been_hit = HurtInTurf(TT, been_hit, beam_direct_damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/turf/TT in affected_turfs) // Remaining damage effect
BeamTurfEffect(TT, beam_overtime_damage)
@@ -263,7 +256,7 @@
/mob/living/simple_animal/hostile/ordeal/white_fixer/proc/BeamTurfEffect(turf/T, damage = 10)
set waitfor = FALSE
for(var/i = 1 to 5)
- HurtInTurf(T, list(), damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE)
+ HurtInTurf(T, list(), damage, WHITE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
sleep(5)
/mob/living/simple_animal/hostile/ordeal/white_fixer/proc/CircleBeam()
@@ -294,21 +287,21 @@
can_act = TRUE
/mob/living/simple_animal/hostile/ordeal/white_fixer/proc/StartReflecting()
- can_act = FALSE
damage_reflection = TRUE
+ can_act = FALSE
damage_taken = 0
playsound(src, 'sound/effects/ordeals/white/white_reflect.ogg', 50, TRUE, 7)
visible_message(" 0)
- ReflectDamage(M, M.melee_damage_type, damage)
+/mob/living/simple_animal/hostile/ordeal/white_fixer/proc/DenyDamage()
+ SIGNAL_HANDLER
+ return COMPONENT_MOB_DENY_DAMAGE
-/mob/living/simple_animal/hostile/ordeal/white_fixer/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE)
- . = ..()
- if(damage_reflection && Proj.firer)
- ReflectDamage(Proj.firer, Proj.damage_type, Proj.damage)
+/// Reflects damage when reflection is active and we're given a living source. There is no need to return FALSE to prevent the damage here, because we already are using the DenyDamage() signal handler for that.
+/mob/living/simple_animal/hostile/ordeal/white_fixer/PreDamageReaction(damage_amount, damage_type, source, attack_type)
+ if(damage_reflection && isliving(source) && !(attack_type & ATTACK_TYPE_STATUS)) // However, we will have mercy on people who applied long status effects like Adoration DoT
+ ReflectDamage(source, damage_type, damage_amount)
-/mob/living/simple_animal/hostile/ordeal/white_fixer/attackby(obj/item/I, mob/living/user, params)
- . = ..()
- if(!damage_reflection)
+/mob/living/simple_animal/hostile/ordeal/white_fixer/PostDamageReaction(damage_amount, damage_type, source, attack_type)
+ if(. > 0)
+ damage_taken += .
+ if(damage_taken >= 480 && !damage_reflection)
+ damage_reflection = TRUE
+ INVOKE_ASYNC(src, PROC_REF(StartReflecting))
return
- var/damage = I.force
- if(ishuman(user))
- damage *= 1 + (get_modified_attribute_level(user, JUSTICE_ATTRIBUTE) / 100)
- ReflectDamage(user, I.damtype, damage)
-// Black Fixer
+// Red Fixer
/mob/living/simple_animal/hostile/ordeal/red_fixer
name = "Red Fixer"
desc = "A humanoid creature resembling a robot or a cyborg."
@@ -443,7 +418,7 @@
SLEEP_CHECK_DEATH(4)
forceMove(slash_end)
for(var/turf/T in hitline)
- for(var/mob/living/L in HurtInTurf(T, list(), multislash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), multislash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
to_chat(L, span_userdanger("[src] slashes you at a high speed!"))
var/datum/beam/B1 = slash_start.Beam(slash_end, "volt_ray", time=3)
B1.visuals.color = COLOR_YELLOW
@@ -451,7 +426,7 @@
SLEEP_CHECK_DEATH(3)
forceMove(slash_start)
for(var/turf/T in hitline)
- for(var/mob/living/L in HurtInTurf(T, list(), multislash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), multislash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
to_chat(L, span_userdanger("[src] slashes you at a high speed!"))
var/datum/beam/B2 = slash_start.Beam(slash_end, "volt_ray", time=6)
B2.visuals.color = COLOR_RED
@@ -483,7 +458,7 @@
if(faction_check_mob(L))
continue
to_chat(L, span_userdanger("A red laser passes right through you!"))
- L.apply_damage(beam_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(beam_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
been_hit |= L
new /obj/effect/temp_visual/cult/sparks(get_turf(L))
playsound(src, 'sound/effects/ordeals/white/red_beam_fire.ogg', 100, FALSE, 32)
@@ -616,7 +591,7 @@
S.pixel_x = rand(-8, 8)
S.pixel_y = rand(-8, 8)
animate(S, alpha = 0, time = 1.5)
- for(var/mob/living/L in HurtInTurf(T, list(), multislash_damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), multislash_damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
to_chat(L, span_userdanger("[src] stabs you!"))
new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(L), dir_to_target)
playsound(src, attack_sound, 50, TRUE, 3)
@@ -663,7 +638,7 @@
B.visuals.transform = M
var/list/been_hit = list()
for(var/turf/T in hitline)
- var/list/new_hits = HurtInTurf(T, been_hit, tentacle_damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE) - been_hit
+ var/list/new_hits = HurtInTurf(T, been_hit, tentacle_damage, PALE_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, hurt_structure = TRUE, attack_type = (ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/L in new_hits)
to_chat(L, span_userdanger("A pale beam passes right through you!"))
diff --git a/code/modules/mob/living/simple_animal/hostile/ordeal/white/the_claw.dm b/code/modules/mob/living/simple_animal/hostile/ordeal/white/the_claw.dm
index 67f52e7c4376..10fffcf48685 100644
--- a/code/modules/mob/living/simple_animal/hostile/ordeal/white/the_claw.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ordeal/white/the_claw.dm
@@ -266,7 +266,7 @@
if(faction_check_mob(L))
continue
to_chat(target, span_userdanger("\The [src] eviscerates you!"))
- L.apply_damage(40, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(40, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/cleave(get_turf(L))
/mob/living/simple_animal/hostile/megafauna/claw/proc/TargetSerumW(mob/living/L)
@@ -328,7 +328,7 @@
if(LL == L)
continue
to_chat(LL, span_userdanger("\The [src] slashes you!"))
- LL.apply_damage(15, BLACK_DAMAGE, null, LL.run_armor_check(null, BLACK_DAMAGE))
+ LL.deal_damage(15, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/cleave(get_turf(LL))
tp_loc = get_step(src, pick(1,2,4,5,6,8,9,10))
for(var/obj/item/I in get_turf(L)) // We take all dropped items with us, just to be fair, you know
@@ -343,7 +343,7 @@
SLEEP_CHECK_DEATH(4)
if(istype(L) && !QDELETED(L))
to_chat(L, span_userdanger("\The [src] slashes you, finally releasing you from his grasp!"))
- L.apply_damage(25, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(25, BLACK_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
GiveTarget(L)
charging = FALSE
@@ -410,7 +410,7 @@
continue
been_hit |= L
to_chat(target, span_userdanger("\The [src] eviscerates you!"))
- L.apply_damage(70, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE))
+ L.deal_damage(70, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/cleave(get_turf(L))
for(var/turf/B in getline(prev_loc, tp_loc))
for(var/mob/living/L in range(1, B)) // Attacks everyone in line
@@ -420,7 +420,7 @@
continue
been_hit |= L
to_chat(L, span_userdanger("\The [src] slashes you!"))
- L.apply_damage(50, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE))
+ L.deal_damage(50, PALE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
playsound(L, 'ModularTegustation/Tegusounds/claw/attack.ogg', 35, 1)
new /obj/effect/temp_visual/cleave(get_turf(L))
@@ -448,7 +448,7 @@
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
forceMove(T)
playsound(src,'ModularTegustation/Tegusounds/claw/move.ogg', 50, 1)
- for(var/mob/living/L in HurtInTurf(T, list(), dash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE))
+ for(var/mob/living/L in HurtInTurf(T, list(), dash_damage, RED_DAMAGE, check_faction = TRUE, hurt_mechs = TRUE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL)))
new /obj/effect/temp_visual/cleave(L.loc)
if(T != turf_list[turf_list.len]) // Not the last turf
SLEEP_CHECK_DEATH(0.5)
@@ -520,7 +520,7 @@
if(victim == LT)
continue
to_chat(victim, span_userdanger("\The [src] slashes you!"))
- victim.apply_damage(serumA_damage, RED_DAMAGE, null, victim.run_armor_check(null, RED_DAMAGE))
+ victim.deal_damage(serumA_damage, RED_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/cleave(victim.loc)
playsound(victim, 'ModularTegustation/Tegusounds/claw/attack.ogg', 35, 1)
@@ -575,4 +575,4 @@
continue
if(faction_check_mob(L))
continue
- L.apply_damage(wide_slash_damage, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(wide_slash_damage, WHITE_DAMAGE, src, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
diff --git a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm
index 4c9f7642596d..6adad1efa06c 100644
--- a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm
+++ b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm
@@ -95,7 +95,7 @@
playsound(owner, 'sound/effects/assslap.ogg', 90)
var/atom/throw_target = get_edge_target_turf(target, ranged_ability_user.dir)
living_target.throw_at(throw_target, 6, 4, owner)
- living_target.apply_damage(30)
+ living_target.deal_damage(30, source = owner, attack_type = (ATTACK_TYPE_MELEE))
current_cooldown = world.time + cooldown
remove_ranged_ability()
return TRUE
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 2364da342d87..cb427d561255 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -76,7 +76,7 @@
)
jedi.Stun(3 SECONDS)
new /obj/effect/gibspawner/generic(get_turf(jedi), jedi)
- jedi.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
+ jedi.deal_damage(30, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
if(QDELETED(jedi))
return // damage was too much
if(jedi.stat == DEAD)
@@ -92,7 +92,7 @@
if(QDELETED(jedi))
return
new /obj/effect/gibspawner/generic(get_turf(jedi), jedi)
- jedi.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
+ jedi.deal_damage(30, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
if(QDELETED(jedi))
return // damage was too much
if(jedi.stat == DEAD)
@@ -109,7 +109,7 @@
if(QDELETED(jedi))
return
new /obj/effect/gibspawner/generic(get_turf(jedi), jedi)
- jedi.apply_damage(30, BRUTE, BODY_ZONE_HEAD)
+ jedi.deal_damage(30, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
if(QDELETED(jedi))
return // damage was too much
jedi.ghostize()
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 914325046d6f..142f1a724536 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -200,7 +200,7 @@
user.visible_message("[user.name] tries to fire \the [src] at the same time, but only succeeds at looking like an idiot.", "\The [src]'s anti-combat mechanism prevents you from firing it at the same time!")
/obj/item/gun/ballistic/revolver/russian/proc/shoot_self(mob/living/carbon/human/user, affecting = BODY_ZONE_HEAD)
- user.apply_damage(300, BRUTE, affecting)
+ user.deal_damage(300, BRUTE, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = affecting)
user.visible_message("[user.name] fires [src] at [user.p_their()] head!", "You fire [src] at your head!", "You hear a gunshot!")
/obj/item/gun/ballistic/revolver/russian/soul
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 742a420ad7ef..6db213e1cec1 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -400,7 +400,7 @@
if(modifier)
for(var/mob/living/L in range(1, target_turf) - K.firer - target)
var/armor = L.run_armor_check(K.def_zone, K.damage_type, "", "", K.armour_penetration)
- L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
+ L.deal_damage(K.damage*modifier, K.damage_type, source = K.firer, attack_type = (ATTACK_TYPE_RANGED), def_zone = K.def_zone, blocked = armor)
to_chat(L, "You're struck by a [K.name]!")
/obj/item/borg/upgrade/modkit/aoe/turfs
@@ -506,7 +506,7 @@
if(K.pressure_decrease_active)
kill_modifier *= K.pressure_decrease
var/armor = L.run_armor_check(K.def_zone, K.damage_type, "", "", K.armour_penetration)
- L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
+ L.deal_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, source = K.firer, attack_type = (ATTACK_TYPE_RANGED), def_zone = K.def_zone, blocked = armor)
/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
var/bonus_mod = 1
diff --git a/code/modules/projectiles/guns/misc/reindeer.dm b/code/modules/projectiles/guns/misc/reindeer.dm
index 0b1a48bd8bb0..78fad89a0ae7 100644
--- a/code/modules/projectiles/guns/misc/reindeer.dm
+++ b/code/modules/projectiles/guns/misc/reindeer.dm
@@ -160,7 +160,7 @@
return
/obj/item/gun/mindwhip/proc/on_beam_tick(mob/living/target)
- target.apply_damage(beam_damage, damtype, null, target.run_armor_check(null, damtype), spread_damage = TRUE)
+ target.deal_damage(beam_damage, damtype, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
for(var/mob/living/carbon/human/L in range(5, get_turf(src)))
L.adjustSanityLoss(-1) //Sanity healing for those around, but heals less than the healbeam
new /obj/effect/temp_visual/heal(get_turf(L), "#80F5FF")
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 179bcb41bd95..91deaadffb49 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -369,7 +369,7 @@
if(fairy)
if(ishuman(target))
var/mob/living/carbon/human/M = target
- M.apply_damage(8, WHITE_DAMAGE, null, M.run_armor_check(null, WHITE_DAMAGE), spread_damage = TRUE)
+ M.deal_damage(8, WHITE_DAMAGE, firer, attack_type = (ATTACK_TYPE_RANGED))
if(M.sanity_lost)
fairy.Convert(M)
diff --git a/code/modules/reagents/chemistry/reagents/lc13_reagents.dm b/code/modules/reagents/chemistry/reagents/lc13_reagents.dm
index 9543770d2f01..63e3ca153a3a 100644
--- a/code/modules/reagents/chemistry/reagents/lc13_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/lc13_reagents.dm
@@ -9,13 +9,13 @@
var/damtype = RED_DAMAGE
/datum/reagent/toxin/lc13_toxin/on_mob_life(mob/living/carbon/M)
- M.deal_damage(damage, damtype)//toxpwr is 1.5 from the toxin subtype
+ M.deal_damage(damage, damtype, attack_type = (ATTACK_TYPE_STATUS))//toxpwr is 1.5 from the toxin subtype
return ..()
/datum/reagent/toxin/lc13_toxin/expose_mob(mob/living/exposed_mob, methods=VAPOR, reac_volume, touch_protection=0)
. = ..()
reac_volume = round(reac_volume,0.1)
- exposed_mob.deal_damage(min(round(0.4 * reac_volume, 0.1), damage*2), damtype)
+ exposed_mob.deal_damage(min(round(0.4 * reac_volume, 0.1), damage*2), damtype, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_OTHER))
/datum/reagent/toxin/lc13_toxin/weak
name = "Diluted Red Toxin"
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 29589e634d85..9d11e122e08a 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -159,7 +159,7 @@
else
to_chat(victim, "[src] injects you!")
- victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
+ victim.deal_damage(5, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_HEAD)
reagents?.trans_to(victim, round(reagents.total_volume*(2/3)), transfered_by = user, methods = INJECT)
return discover_after
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 81e2476868ed..4cb3661c9e89 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -248,7 +248,7 @@
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!")
for(var/mob/living/m in oview(1, src))
- m.apply_damage(15, BRUTE, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
+ m.deal_damage(15, BRUTE, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
investigate_log("Experimentor dealt minor brute to [m].", INVESTIGATE_EXPERIMENTOR)
ejectItem(TRUE)
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
@@ -380,7 +380,7 @@
visible_message("[src] malfunctions, activating its emergency coolant systems!")
throwSmoke(loc)
for(var/mob/living/m in oview(1, src))
- m.apply_damage(5, FIRE, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
+ m.deal_damage(5, FIRE, flags = (DAMAGE_FORCED | DAMAGE_NO_SPREAD), def_zone = pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN))
investigate_log("Experimentor has dealt minor burn damage to [key_name(m)]", INVESTIGATE_EXPERIMENTOR)
ejectItem()
////////////////////////////////////////////////////////////////////////////////////////////////
@@ -493,7 +493,7 @@
visible_message("Experimentor draws the life essence of those nearby!")
for(var/mob/living/m in view(4,src))
to_chat(m, "You feel your flesh being torn from you, mists of blood drifting to [src]!")
- m.apply_damage(50, BRUTE, BODY_ZONE_CHEST)
+ m.deal_damage(50, BRUTE, flags = (DAMAGE_FORCED), def_zone = BODY_ZONE_CHEST)
investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", INVESTIGATE_EXPERIMENTOR)
if(globalMalf > 51 && globalMalf < 75)
visible_message("[src] encounters a run-time error!")
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index caad15769196..a3a85982544a 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -228,7 +228,7 @@ Burning extracts:
else
user.visible_message("[src] sublimates the flesh around [user]'s arm, transforming the bone into a gruesome blade!")
user.emote("scream")
- L.apply_damage(30,FIRE,which_hand)
+ L.deal_damage(30, FIRE, flags = (DAMAGE_FORCED), def_zone = which_hand)
..()
/obj/item/slimecross/burning/pink
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 15de6c1121f4..a32b558a361e 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -260,7 +260,7 @@ Chilling extracts:
else
user.visible_message(span_danger("[src] chills and snaps off the front of the bone on [user]'s arm, leaving behind a strange, gun-like structure!"))
user.emote("scream")
- L.apply_damage(30,FIRE,which_hand)
+ L.deal_damage(30, FIRE, flags = (DAMAGE_FORCED), def_zone = which_hand)
..()
/obj/item/slimecross/chilling/pink
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 1d5dc227d4b9..6681af0ad6d7 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -34,7 +34,7 @@ All ShuttleMove procs go here
M.visible_message(span_warning("[shuttle] slams into [M]!"))
SSblackbox.record_feedback("tally", "shuttle_gib", 1, M.type)
log_attack("[key_name(M)] was hit by a shuttle; [shuttle].")
- M.apply_damage(300, RED_DAMAGE, null, M.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ M.deal_damage(100, RED_DAMAGE, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
M.Stun(70)
diff --git a/code/modules/spells/ability_types/realized.dm b/code/modules/spells/ability_types/realized.dm
index 6461ee944f6a..7b686e6a8b51 100644
--- a/code/modules/spells/ability_types/realized.dm
+++ b/code/modules/spells/ability_types/realized.dm
@@ -88,7 +88,7 @@
continue
if(L.stat == DEAD)
continue
- L.apply_damage(damage_amount, WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage(damage_amount, WHITE_DAMAGE, user, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/revenant(get_turf(L))
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
@@ -195,7 +195,7 @@
if(L.stat == DEAD)
continue
H.adjustBruteLoss(-10)
- L.apply_damage(damage_amount, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(damage_amount, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health < 0)
L.gib()
playsound(get_turf(user), 'sound/abnormalities/nothingthere/goodbye_attack.ogg', 75, 0, 7)
@@ -226,7 +226,7 @@
continue
if(L.stat == DEAD)
continue
- L.apply_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
L.apply_status_effect(/datum/status_effect/mosb_black_debuff)
return ..()
@@ -286,7 +286,7 @@
if(L.stat == DEAD)
continue
new /obj/effect/temp_visual/judgement(get_turf(L))
- L.apply_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, PALE_DAMAGE, null, L.run_armor_check(null, PALE_DAMAGE))
+ L.deal_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, PALE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
L.apply_status_effect(/datum/status_effect/judgement_pale_debuff)
return ..()
@@ -357,7 +357,7 @@
if(L.stat == DEAD)
continue
playsound(get_turf(L), 'sound/effects/wounds/sizzle2.ogg', 25, TRUE)
- L.apply_damage(ishuman(L) ? explosion_damage*0.5 : explosion_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(ishuman(L) ? explosion_damage*0.5 : explosion_damage, RED_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
sleep(1)
/* King of Greed - Gold Experience */
@@ -539,7 +539,7 @@
targets_hit[L] += 1
else
targets_hit[L] = 1
- L.apply_damage(temp_dam, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(temp_dam, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
@@ -601,10 +601,11 @@
/obj/effect/proc_holder/ability/punishment
name = "Punishment"
- desc = "Causes massive damage in a small area only when you take a blow."
+ desc = "Gives you a counter attack for 5 seconds that reduces damage taken while dealing massive red damage.\
+ Repeat attacks from the same enemy will reduce the effectiveness of the counter attack against them."
action_icon_state = "bird0"
base_icon_state = "bird"
- cooldown_time = 25 SECONDS
+ cooldown_time = 30 SECONDS
/obj/effect/proc_holder/ability/punishment/Perform(target, mob/user)
var/mob/living/carbon/human/H = user
@@ -616,10 +617,17 @@
status_type = STATUS_EFFECT_UNIQUE
alert_type = /atom/movable/screen/alert/status_effect/punishment
duration = 5 SECONDS
+ var/damage = 100 //Can do up to 650 damage
+ var/bite_range = 8
+ var/list/targets_hit = list()
+ var/max_damage_reduction = 0.5
+ var/min_damage_reduction = 0.8
+ var/counter_cooldown
+ var/counter_cooldown_time = 0.5 SECONDS
/atom/movable/screen/alert/status_effect/punishment
name = "Ready to punish"
- desc = "You're ready to punish."
+ desc = "Your armor is ready to counter attacks."
icon = 'ModularTegustation/Teguicons/status_sprites.dmi'
icon_state = "punishment"
@@ -627,21 +635,56 @@
. = ..()
RegisterSignal(owner, COMSIG_MOB_APPLY_DAMGE, PROC_REF(Rage))
-/datum/status_effect/punishment/proc/Rage(mob/living/sorce, obj/item/thing, mob/living/attacker)
+/datum/status_effect/punishment/proc/Rage(mob/us, damage_amount, damage_type, def_zone, attacker, damage_flags, attack_type)
SIGNAL_HANDLER
var/mob/living/carbon/human/H = owner
- H.apply_status_effect(/datum/status_effect/pbird)
- H.remove_status_effect(/datum/status_effect/punishment)
- to_chat(H, span_userdanger("You strike back at the wrong doer!"))
+ if(attacker == us || counter_cooldown >= world.time || (attack_type & (ATTACK_TYPE_COUNTER)))//We don't want to cause an infinite looping with 2 counter attacks constantly countering the other
+ damage_amount *= min_damage_reduction
+ return
+ if(!H.has_status_effect(/datum/status_effect/pbird))
+ H.apply_status_effect(/datum/status_effect/pbird)
+ counter_cooldown = world.time + counter_cooldown_time
playsound(H, 'sound/abnormalities/apocalypse/beak.ogg', 100, FALSE, 12)
- for(var/turf/T in view(2, H))
+
+ if(damage_amount <= 0 || !isliving(attacker) || get_dist(H, attacker) > bite_range || (attack_type & (ATTACK_TYPE_ENVIRONMENT | ATTACK_TYPE_STATUS)))
+ damage_amount *= min_damage_reduction
+ to_chat(H, span_userdanger("Your armor thrashes wildly!"))
+ for(var/turf/T in view(2, H))
+ new /obj/effect/temp_visual/beakbite(T)
+ for(var/mob/living/L in T)
+ if(H.faction_check_mob(L, FALSE))
+ continue
+ if(L.stat == DEAD)
+ L.gib()
+ continue
+ L.deal_damage(damage - 50, RED_DAMAGE, H, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL | ATTACK_TYPE_COUNTER))
+ if(L.health < 0)
+ L.gib()
+ return
+
+ to_chat(H, span_userdanger("Your armor lashes out at [attacker]!"))
+ if(attacker in targets_hit)
+ targets_hit[attacker] += 1
+ else
+ targets_hit[attacker] = 1
+ H.do_attack_animation(attacker)
+ damage_amount *= max_damage_reduction + min(0.3, (targets_hit[attacker] - 1) * 0.06)
+
+ var/list/turfs = list()
+ for(var/turf/T in getline(H, get_ranged_target_turf_direct(H, attacker, bite_range-1)))
+ for(var/turf/TT in view(T,1))
+ if(TT in turfs)
+ continue
+ turfs += TT
+ for(var/turf/T in turfs)
new /obj/effect/temp_visual/beakbite(T)
for(var/mob/living/L in T)
- if(H.faction_check_mob(L, FALSE))
+ if(H.faction_check_mob(L, FALSE) && L != attacker)//Lets you hurt other players that accidentally hit you.
continue
if(L.stat == DEAD)
+ L.gib()
continue
- L.apply_damage(250, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(damage - min(50, (targets_hit[attacker] - 1) * 10), RED_DAMAGE, H, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL | ATTACK_TYPE_COUNTER))
if(L.health < 0)
L.gib()
@@ -883,7 +926,7 @@
if(get_dist(user, T) > i)
continue
new /obj/effect/temp_visual/dir_setting/speedbike_trail(T)
- var/list/new_hits = user.HurtInTurf(damage_amount, been_hit, WHITE_DAMAGE) - been_hit
+ var/list/new_hits = user.HurtInTurf(damage_amount, list(), WHITE_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL)) - been_hit
been_hit += new_hits
for(var/mob/living/carbon/human/L in T)
if(!user.faction_check_mob(L, FALSE))
@@ -1017,7 +1060,7 @@
/datum/status_effect/galaxy_gift/proc/Pop()
var/damage_mult = LAZYLEN(gifted)
for(var/mob/living/carbon/human/H in gifted)
- H.apply_damage(base_dmg_amt*damage_mult, BLACK_DAMAGE, null, H.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ H.deal_damage(base_dmg_amt*damage_mult, BLACK_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_SPECIAL))
H.remove_status_effect(/datum/status_effect/galaxy_gift)
new /obj/effect/temp_visual/pebblecrack(get_turf(H))
playsound(get_turf(H), "shatter", 50, TRUE)
@@ -1237,7 +1280,7 @@
var/mob/living/carbon/human/H = owner
var/list/damtypes = list(RED_DAMAGE, WHITE_DAMAGE, BLACK_DAMAGE, PALE_DAMAGE)
var/damage = pick(damtypes)
- H.apply_damage(4, damage, null, H.run_armor_check(null, damage), spread_damage = TRUE)
+ H.deal_damage(4, damage, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_STATUS))
/datum/status_effect/flesh1/on_remove()
. = ..()
@@ -1446,7 +1489,7 @@
user.orbit(DE, 0, 0, 0, 0, 0)
sleep(1)
- target.apply_damage(50, RED_DAMAGE, null, target.run_armor_check(null, RED_DAMAGE))
+ target.deal_damage(50, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/rip_space_slash(get_turf(target))
new /obj/effect/temp_visual/ripped_space(get_turf(target))
playsound(user, 'sound/abnormalities/wayward_passenger/ripspace_hit.ogg', 75, 0)
diff --git a/code/modules/spells/ability_types/realized_aimed.dm b/code/modules/spells/ability_types/realized_aimed.dm
index dde2db3bef3c..86924f227f46 100644
--- a/code/modules/spells/ability_types/realized_aimed.dm
+++ b/code/modules/spells/ability_types/realized_aimed.dm
@@ -57,7 +57,7 @@
visible_message("[user] runs through [L]!")
playsound(L, 'sound/abnormalities/helper/attack.ogg', 25, 1)
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
- L.apply_damage(dash_damage, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE))
+ L.deal_damage(dash_damage, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(L.health <= 0)
L.gib()
return .. ()
@@ -96,7 +96,7 @@
H.adjustSanityLoss(-damage_amount)
continue
var/distance_decrease = get_dist(T, L) * 10
- L.apply_damage((damage_amount - distance_decrease), WHITE_DAMAGE, null, L.run_armor_check(null, WHITE_DAMAGE))
+ L.deal_damage((damage_amount - distance_decrease), WHITE_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/revenant(get_turf(L))
/* Knight of Despair - Quenched with Blood */
@@ -145,7 +145,7 @@
if(ishostile(target))
var/mob/living/simple_animal/hostile/H = target
H.TemporarySpeedChange(1, 10 SECONDS)
- H.apply_damage(50 + (0.05 * H.maxHealth), PALE_DAMAGE)
+ H.deal_damage(50 + (0.05 * H.maxHealth), PALE_DAMAGE, firer, attack_type = (ATTACK_TYPE_RANGED))
..()
qdel(src)
@@ -263,7 +263,7 @@
if(LH.sanity_lost)
LH.adjustSanityLoss(-6*justice) // Pretty fast resaning, but this only applies to insanes
continue
- L.apply_damage(beam_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage(beam_damage, BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_RANGED | ATTACK_TYPE_SPECIAL))
accumulated_beam_damage += beam_damage
if(!Channel(H, 8))
break
@@ -377,7 +377,7 @@
continue
if(L.stat == DEAD)
continue
- L.apply_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, RED_DAMAGE, user, attack_type = (ATTACK_TYPE_MELEE | ATTACK_TYPE_SPECIAL))
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
H.TemporarySpeedChange(1 + damage_slowdown, 10 SECONDS, TRUE) // Slow down
@@ -413,7 +413,7 @@
continue
if(L.stat == DEAD)
continue
- L.apply_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, RED_DAMAGE, null, L.run_armor_check(null, RED_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(ishuman(L) ? damage_amount*0.5 : damage_amount, RED_DAMAGE, flags = (DAMAGE_FORCED))
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
H.TemporarySpeedChange(damage_slowdown, 3 SECONDS) // Slow down
@@ -463,7 +463,7 @@
for(var/mob/living/L in view(damage_range, src))
if(ishostile(L))
var/distance_decrease = get_dist(src, L) * 20
- L.apply_damage(ishuman(L) ? (damage_amount - distance_decrease)*0.5 : (damage_amount - distance_decrease), BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(ishuman(L) ? (damage_amount - distance_decrease)*0.5 : (damage_amount - distance_decrease), BLACK_DAMAGE, firer, attack_type = (ATTACK_TYPE_SPECIAL))
var/atom/throw_target = get_edge_target_turf(L, get_dir(L, get_step_towards(L, get_turf(src))))
L.throw_at(throw_target, 1, 2)
@@ -511,7 +511,7 @@
for(var/mob/living/L in T)
if(faction_check(L.faction, src.faction))
continue
- L.apply_damage(damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(damage, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
for(var/mob/living/carbon/human/L in T)
if(!faction_check(L.faction, src.faction))
continue
@@ -611,7 +611,7 @@
H.apply_status_effect(/datum/status_effect/home_buff)
continue
var/distance_decrease = get_dist(T, L) * 10
- L.apply_damage((damage_amount - distance_decrease), BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE))
+ L.deal_damage((damage_amount - distance_decrease), BLACK_DAMAGE, user, attack_type = (ATTACK_TYPE_SPECIAL))
new /obj/effect/temp_visual/revenant(get_turf(L))
/datum/status_effect/home_buff
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 1ebb01f6f1ba..8370d416a962 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -138,7 +138,7 @@
duffelvictim.flash_act()
duffelvictim.Immobilize(5 SECONDS)
- duffelvictim.apply_damage(80, STAMINA)
+ duffelvictim.deal_damage(80, STAMINA, source = user, attack_type = (ATTACK_TYPE_MELEE))
duffelvictim.Knockdown(5 SECONDS)
if(HAS_TRAIT(target, TRAIT_DUFFEL_CURSED))
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index a68c8b019f10..77e60dd2e3b9 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -147,7 +147,7 @@
var/damage_percent = (stored.maxHealth - stored.health)/stored.maxHealth;
var/damapply = damage_percent * shape.maxHealth;
- shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND);
+ shape.deal_damage(damapply, source.convert_damage_type, flags = (DAMAGE_FORCED | DAMAGE_PIERCING), wound_bonus = CANT_WOUND);
shape.blood_volume = stored.blood_volume;
RegisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(shape_death))
@@ -210,7 +210,7 @@
var/damage_percent = (shape.maxHealth - shape.health)/shape.maxHealth;
var/damapply = stored.maxHealth * damage_percent
- stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE, wound_bonus=CANT_WOUND)
+ stored.deal_damage(damapply, source.convert_damage_type, flags = (DAMAGE_FORCED | DAMAGE_PIERCING), wound_bonus=CANT_WOUND)
if(source.convert_damage)
stored.blood_volume = shape.blood_volume;
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index e585e91fed54..55058f979c9b 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -339,7 +339,7 @@
for(var/mob/living/L in thrown_atoms)
if(user.faction_check_mob(L))
continue
- L.apply_damage(repulse_damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(repulse_damage, BLACK_DAMAGE, source = user, attack_type = (ATTACK_TYPE_SPECIAL))
/obj/effect/proc_holder/spell/targeted/sacred_flame
name = "Sacred Flame"
diff --git a/code/modules/suppressions/extraction.dm b/code/modules/suppressions/extraction.dm
index 0dd37da88824..929e6ca3aacf 100644
--- a/code/modules/suppressions/extraction.dm
+++ b/code/modules/suppressions/extraction.dm
@@ -579,7 +579,7 @@
continue
if(L.stat == DEAD)
continue
- L.apply_damage(damage, BLACK_DAMAGE, null, L.run_armor_check(null, BLACK_DAMAGE), spread_damage = TRUE)
+ L.deal_damage(damage, BLACK_DAMAGE, attack_type = (ATTACK_TYPE_SPECIAL))
L.visible_message("[L] has been hit by [name]!",
"You've been hit by [name]!")
sleep(6)
@@ -707,7 +707,7 @@
if(!faction_check(faction, L.faction, FALSE))
L.visible_message(span_boldwarning("[src] crashes into [L]!"), span_userdanger("[src] crashes into you!"))
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
- L.deal_damage(charge_damage, BLACK_DAMAGE)
+ L.deal_damage(charge_damage, BLACK_DAMAGE, flags = (DAMAGE_FORCED), attack_type = (ATTACK_TYPE_ENVIRONMENT))
if(L.stat >= HARD_CRIT)
L.gib()
playsound(L, 'sound/abnormalities/kog/GreedHit1.ogg', 20, 1)
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 95f194e26d9d..475c43e35772 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -116,7 +116,7 @@
return TRUE
/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results)
- target.apply_damage(10, BRUTE, "[target_zone]", wound_bonus=CANT_WOUND)
+ target.deal_damage(10, BRUTE, flags = (DAMAGE_FORCED), def_zone = "[target_zone]", wound_bonus=CANT_WOUND)
display_results(user, target, "You saw [target]'s [parse_zone(target_zone)] open.",
"[user] saws [target]'s [parse_zone(target_zone)] open!",
"[user] saws [target]'s [parse_zone(target_zone)] open!")
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index a7bd52063c9c..150d48313671 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -304,7 +304,7 @@
cooldown = COOLDOWN_DAMAGE
for(var/V in listeners)
var/mob/living/L = V
- L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND)
+ L.deal_damage(15 * power_multiplier, source = user, attack_type = (ATTACK_TYPE_SPECIAL), def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND)
//BLEED
else if((findtext(message, bleed_words)))
diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm
index 7ad1b457fae7..f0199909ff97 100644
--- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm
+++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm
@@ -136,7 +136,7 @@
else
//drill makes a hole
var/obj/item/bodypart/target_part = target.get_bodypart(ran_zone(BODY_ZONE_CHEST))
- target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, MELEE))
+ target.deal_damage(10, BRUTE, source = chassis, attack_type = (ATTACK_TYPE_MELEE), def_zone = BODY_ZONE_CHEST, blocked = target.run_armor_check(target_part, MELEE))
//blood splatters
var/splatter_dir = get_dir(chassis, target)
diff --git a/code/modules/vehicles/mecha/equipment/weapons/mecha_melee.dm b/code/modules/vehicles/mecha/equipment/weapons/mecha_melee.dm
index 1552d42e0b24..2a59903f368a 100644
--- a/code/modules/vehicles/mecha/equipment/weapons/mecha_melee.dm
+++ b/code/modules/vehicles/mecha/equipment/weapons/mecha_melee.dm
@@ -54,7 +54,7 @@
var/mob/living/simple_animal/hostile/H = target
H.attack_threshold_check(force, damtype)
else
- L.apply_damage(force, damtype, null, L.run_armor_check(null, damtype), spread_damage = TRUE)
+ L.deal_damage(force, damtype, source = chassis, attack_type = (ATTACK_TYPE_MELEE))
if(prob(50))
L.add_splatter_floor(get_turf(L))
chassis.do_attack_animation(L)
diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm
index 83558b1d3676..6867e6ab5625 100644
--- a/code/modules/vehicles/mecha/mech_melee_attack.dm
+++ b/code/modules/vehicles/mecha/mech_melee_attack.dm
@@ -58,7 +58,7 @@
if(TOX)
mecha_attacker.mech_toxin_damage(src)
else
- apply_damage(mecha_attacker.force, mecha_attacker.damtype, null, run_armor_check(null, mecha_attacker.damtype), FALSE, TRUE)
+ deal_damage(mecha_attacker.force, mecha_attacker.damtype, mecha_attacker, attack_type = (ATTACK_TYPE_MELEE))
playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE)
visible_message(span_danger("[mecha_attacker.name] hits [src]!"), \
span_userdanger("[mecha_attacker.name] hits you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, mecha_attacker)
diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm
index 3b355155ec41..9b338f0c7eae 100644
--- a/code/modules/vehicles/mecha/mecha_wreckage.dm
+++ b/code/modules/vehicles/mecha/mecha_wreckage.dm
@@ -31,7 +31,7 @@
if(!AI_pilot) //Type-checking for this is already done in mecha/Destroy()
return
AI = AI_pilot
- AI.apply_damage(150, FIRE) //Give the AI a bit of damage from the "shock" of being suddenly shut down
+ AI.deal_damage(150, FIRE, flags = (DAMAGE_FORCED)) //Give the AI a bit of damage from the "shock" of being suddenly shut down
INVOKE_ASYNC(AI, TYPE_PROC_REF(/mob/living/silicon, death)) //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair.
AI.forceMove(src) //Put the dead AI inside the wreckage for recovery
add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index 12e92202bbb1..ff26234490f3 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -57,7 +57,7 @@
var/mob/living/carbon/human/H = A
H.Paralyze(100)
H.adjustStaminaLoss(30)
- H.apply_damage(rand(20,35), BRUTE)
+ H.deal_damage(rand(20,35), BRUTE, attack_type = (ATTACK_TYPE_MELEE))
if(!crash_all)
H.throw_at(throw_target, 4, 3)
visible_message("[src] crashes into [H]!")
diff --git a/code/modules/vehicles/tank.dm b/code/modules/vehicles/tank.dm
index ec7ad83ae2f0..e99e24deb6b2 100644
--- a/code/modules/vehicles/tank.dm
+++ b/code/modules/vehicles/tank.dm
@@ -34,7 +34,7 @@
var/mob/living/carbon/human/H = A
H.Paralyze(100)
H.adjustStaminaLoss(30)
- H.apply_damage(rand(20,35), BRUTE)
+ H.deal_damage(rand(20,35), BRUTE, attack_type = (ATTACK_TYPE_MELEE))
if(!crash_all)
H.throw_at(throw_target, 4, 3)
visible_message("[src] crashes into [H]!")
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 562a73c9794c..bcdb4a5c6666 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -600,7 +600,7 @@ GLOBAL_LIST_EMPTY(vending_products)
new /obj/effect/gibspawner/human/bodypartless(get_turf(C))
if(prob(30))
- C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) // the 30% chance to spread the damage means you escape breaking any bones
+ C.deal_damage(max(0, squish_damage - crit_rebate), flags = (DAMAGE_FORCED | DAMAGE_PIERCING)) // the 30% chance to spread the damage means you escape breaking any bone
else
C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something
C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5)
@@ -608,9 +608,9 @@ GLOBAL_LIST_EMPTY(vending_products)
else
L.visible_message("[L] is crushed by [src]!", \
"You are crushed by [src]!")
- L.apply_damage(squish_damage, forced=TRUE)
+ L.deal_damage(squish_damage, flags = (DAMAGE_FORCED | DAMAGE_PIERCING))
if(crit_case)
- L.apply_damage(squish_damage, forced=TRUE)
+ L.deal_damage(squish_damage, flags = (DAMAGE_FORCED | DAMAGE_PIERCING))
if(was_alive && L.stat == DEAD && L.client)
L.client.give_award(/datum/award/achievement/misc/vendor_squish, L) // good job losing a fight with an inanimate object idiot
diff --git a/lobotomy-corp13.dme b/lobotomy-corp13.dme
index 2780c0fcab8f..e679dc1dd1b6 100644
--- a/lobotomy-corp13.dme
+++ b/lobotomy-corp13.dme
@@ -52,6 +52,7 @@
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\cooldowns.dm"
#include "code\__DEFINES\cult.dm"
+#include "code\__DEFINES\damage.dm"
#include "code\__DEFINES\directional.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"