diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 4c93d11e57b..b478f909ee2 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -202,6 +202,7 @@
next_move_modifier = 1.5 //slow-ass attack speed, 3 times higher than how fast the blob can attack
melee_damage_lower = 20
melee_damage_upper = 20
+ obj_damage = 20
attacktext = "slams"
attack_sound = 'sound/effects/blobattack.ogg'
verb_say = "gurgles"
diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm
index 148343346cb..df1aede8186 100644
--- a/code/game/gamemodes/clock_cult/clock_structures.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures.dm
@@ -120,10 +120,13 @@
attack_generic(user, 15)
/obj/structure/clockwork/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper)
+ if(!M.melee_damage_upper && !M.obj_damage)
return
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
- attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
+ if(M.obj_damage)
+ attack_generic(M, M.obj_damage, M.melee_damage_type)
+ else
+ attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
/obj/structure/clockwork/attack_slime(mob/living/simple_animal/slime/user)
if(!user.is_adult)
diff --git a/code/game/gamemodes/handofgod/structures.dm b/code/game/gamemodes/handofgod/structures.dm
index 2e85511d805..79d6615d06b 100644
--- a/code/game/gamemodes/handofgod/structures.dm
+++ b/code/game/gamemodes/handofgod/structures.dm
@@ -106,10 +106,13 @@
/obj/machinery/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
- if(M.melee_damage_upper > 0)
+ if(M.melee_damage_upper > 0 || M.obj_damage)
M.visible_message("[M.name] smashes against \the [src.name].",\
"You smash against the [src.name].")
- take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
+ if(M.obj_damage)
+ take_damage(M.obj_damage, M.melee_damage_type, 1)
+ else
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
/obj/structure/divine/proc/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index eaeac6f604d..1e67bb66c65 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -462,7 +462,9 @@
/obj/effect/swarmer/destructible/attack_animal(mob/living/simple_animal/S)
S.do_attack_animation(src)
S.changeNext_move(CLICK_CD_MELEE)
- if(S.melee_damage_upper)
+ if(S.obj_damage)
+ take_damage(S.obj_damage, S.melee_damage_type, 1)
+ else if(S.melee_damage_upper)
take_damage(rand(S.melee_damage_lower, S.melee_damage_upper), S.melee_damage_type)
/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index e3388b227f0..2966f0b19a0 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -45,11 +45,14 @@
/obj/structure/barricade/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
- if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
+ if(!M.melee_damage_upper && !M.obj_damage || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
return
visible_message("[M] [M.attacktext] [src]!")
add_logs(M, src, "attacked")
- take_damage(M.melee_damage_upper)
+ if(M.obj_damage)
+ take_damage(M.obj_damage)
+ else
+ take_damage(M.melee_damage_upper)
/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/weldingtool) && user.a_intent != "harm" && material == METAL)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index ae8e248240f..df69996667d 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -276,10 +276,13 @@ Class Procs:
/obj/machinery/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
- if(M.melee_damage_upper > 0)
+ if(M.melee_damage_upper || M.obj_damage)
M.visible_message("[M.name] smashes against \the [src.name].",\
"You smash against the [src.name].")
- take_damage(M.melee_damage_upper, M.melee_damage_type, 1)
+ if(M.obj_damage)
+ take_damage(M.obj_damage, M.melee_damage_type, 1)
+ else
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
/obj/machinery/attack_paw(mob/living/user)
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index c5660af67e7..7043e0bf508 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -76,11 +76,13 @@
/obj/mecha/attack_animal(mob/living/simple_animal/user as mob)
log_message("Attack by simple animal. Attacker - [user].",1)
user.changeNext_move(CLICK_CD_MELEE)
- if(user.melee_damage_upper == 0)
+ if(!user.melee_damage_upper && !user.obj_damage)
user.emote("[user.friendly] [src]")
else
user.do_attack_animation(src)
var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
+ if(user.obj_damage)
+ damage = user.obj_damage
take_directional_damage(damage, "brute", get_dir(src, user))
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
visible_message("[user] [user.attacktext] [src]!")
diff --git a/code/game/objects/items/weapons/holosign_creator.dm b/code/game/objects/items/weapons/holosign_creator.dm
index 854055af4ee..b62cfd8faf3 100644
--- a/code/game/objects/items/weapons/holosign_creator.dm
+++ b/code/game/objects/items/weapons/holosign_creator.dm
@@ -140,7 +140,7 @@
qdel(src)
/obj/effect/overlay/holograph/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper)
+ if(!M.melee_damage_upper && !M.obj_damage)
return
attack_generic(5, M)
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index 2b25f5dfb22..1a74946f921 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -150,10 +150,13 @@
/obj/structure/alien/resin/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
- if(!M.melee_damage_upper)
+ if(!M.melee_damage_upper && !M.obj_damage)
return
visible_message("[M] [M.attacktext] [src]!")
- take_damage(M.melee_damage_upper, M.melee_damage_type)
+ if(M.obj_damage)
+ take_damage(M.obj_damage, M.melee_damage_type)
+ else
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target, height=0)
return !density
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 13b32581dba..0dd4998ac3e 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -177,10 +177,14 @@
/obj/structure/displaycase/attack_animal(mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
M.do_attack_animation(src)
- if(M.melee_damage_upper > 0)
+ if(M.melee_damage_upper || M.obj_damage)
M.visible_message("[M.name] smashes against \the [src.name].",\
"You smash against the [src.name].")
- take_damage(M.melee_damage_upper, M.melee_damage_type, 1)
+ if(M.obj_damage)
+ take_damage(M.obj_damage, M.melee_damage_type, 1)
+ else
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1)
+
/obj/structure/displaycase/attack_hand(mob/user)
user.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index 0c2d8b52c22..a7b1172c922 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -112,11 +112,14 @@
take_damage(20)
/obj/structure/fireaxecabinet/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper)
+ if(!M.melee_damage_upper && !M.obj_damage)
return
M.visible_message("[M] smashes against [src].", \
"You smash against [src].")
- take_damage(M.melee_damage_upper, M.melee_damage_type)
+ if(M.obj_damage)
+ take_damage(M.obj_damage, M.melee_damage_type)
+ else
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
/obj/structure/fireaxecabinet/attack_ai(mob/user)
toggle_lock(user)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index fedae0ed7d6..a3f753c6de1 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -79,13 +79,16 @@
/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M)
M.changeNext_move(CLICK_CD_MELEE)
- if(M.melee_damage_upper == 0 || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
+ if(!M.melee_damage_upper && !M.obj_damage || (M.melee_damage_type != BRUTE && M.melee_damage_type != BURN))
return
M.do_attack_animation(src)
M.visible_message("[M] smashes against [src].", \
"You smash against [src].", \
"You hear twisting metal.")
- take_damage(M.melee_damage_upper, M.melee_damage_type)
+ if(M.obj_damage)
+ take_damage(M.obj_damage, M.melee_damage_type)
+ else
+ take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type)
/obj/structure/grille/mech_melee_attack(obj/mecha/M)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 2cf60ac8808..f6c5c6691d4 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -110,7 +110,7 @@
attack_generic(user)
/obj/structure/mirror/attack_animal(mob/living/simple_animal/M)
- if(M.melee_damage_upper <= 0)
+ if(!M.melee_damage_upper && !M.obj_damage)
return
attack_generic(M)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index cf81ba3b64d..4d8bb9c3702 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -81,8 +81,10 @@
/obj/structure/table/attack_animal(mob/living/simple_animal/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- if(user.melee_damage_upper)
+ if(user.melee_damage_upper || user.obj_damage)
var/dmg_dealt = user.melee_damage_upper
+ if(user.obj_damage)
+ dmg_dealt = user.obj_damage
if(user.environment_smash)
dmg_dealt = 100
visible_message("[user] smashes [src]!")
@@ -536,13 +538,16 @@
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
- if(user.melee_damage_upper)
+ if(user.melee_damage_upper || user.obj_damage)
+ var/dmg_dealt = user.melee_damage_upper
+ if(user.obj_damage)
+ dmg_dealt = user.obj_damage
if(user.environment_smash)
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
visible_message("[user] smashes [src] apart.")
rack_destroy()
else
- take_damage(user.melee_damage_upper, user.melee_damage_type)
+ take_damage(dmg_dealt, user.melee_damage_type)
/obj/structure/rack/attack_tk() // no telehulk sorry
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 4e8a4eb86df..8c89c8f8a0b 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -157,9 +157,12 @@
attack_generic(user, 15)
/obj/structure/window/attack_animal(mob/living/simple_animal/M)
- if(!M.melee_damage_upper)
+ if(!M.melee_damage_upper && !M.obj_damage)
return
- attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
+ if(M.obj_damage)
+ attack_generic(M, M.obj_damage, M.melee_damage_type)
+ else
+ attack_generic(M, M.melee_damage_upper, M.melee_damage_type)
/obj/structure/window/attack_slime(mob/living/simple_animal/slime/user)
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 e93e1435211..e9ad1571a6f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -9,6 +9,7 @@
a_intent = "harm"
sentience_type = SENTIENCE_BOSS
environment_smash = 3
+ obj_damage = 75
weather_immunities = list("lava","ash")
robust_searching = 1
stat_attack = 1
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index c772dbef96e..abc97e1c958 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -43,6 +43,7 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
+ var/obj_damage = 0 //how much damage this simple animal does to objects, if any
var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source