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