diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 9dc39f257b..b5cab5fb6a 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -79,8 +79,7 @@ ..() /obj/machinery/camera/bullet_act(var/obj/item/projectile/P) - if(P.damage_type == BRUTE || P.damage_type == BURN) - take_damage(P.damage) + take_damage(P.get_structure_damage()) /obj/machinery/camera/ex_act(severity) if(src.invuln) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 74edf74ea9..298eff5af2 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -47,10 +47,7 @@ return /obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - - if(prob(Proj.damage)) + if(prob(Proj.get_structure_damage())) set_broken() ..() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 13aa4f9ebc..12df658249 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -149,12 +149,10 @@ /obj/machinery/door/bullet_act(var/obj/item/projectile/Proj) ..() - //Tasers and the like should not damage doors. Nor should TOX, OXY, CLONE, etc damage types - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/damage = Proj.get_structure_damage() // Emitter Blasts - these will eventually completely destroy the door, given enough time. - if (Proj.damage > 90) + if (damage > 90) destroy_hits-- if (destroy_hits <= 0) visible_message("\The [src.name] disintegrates!") @@ -166,9 +164,9 @@ new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! qdel(src) - if(Proj.damage) + if(damage) //cap projectile damage so that there's still a minimum number of hits required to break the door - take_damage(min(Proj.damage, 100)) + take_damage(min(damage, 100)) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index c7e5c3f404..5a70afcda1 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -371,7 +371,9 @@ var/list/turret_icons die() //the death process :( /obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj) - if(Proj.damage_type == HALLOSS) + var/damage = Proj.get_structure_damage() + + if(!damage) return if(enabled) @@ -383,8 +385,7 @@ var/list/turret_icons ..() - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - take_damage(Proj.damage) + take_damage(damage) /obj/machinery/porta_turret/emp_act(severity) if(enabled) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 96dda70158..1ee48b6b0b 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -601,7 +601,7 @@ if(prob(15)) break //give a chance to exit early - Proj.on_hit(src) + Proj.on_hit(src) //on_hit just returns if it's argument is not a living mob so does this actually do anything? return /obj/mecha/ex_act(severity) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 424f55896b..3b566fee6e 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -40,7 +40,7 @@ /obj/effect/spider/bullet_act(var/obj/item/projectile/Proj) ..() - health -= Proj.damage + health -= Proj.get_structure_damage() healthcheck() /obj/effect/spider/proc/healthcheck() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index e9670ce4d7..98e9ccdc5c 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -205,7 +205,7 @@ qdel(src) /obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() healthcheck() return 0 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 68aeecd912..5fab9c4554 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -195,11 +195,12 @@ qdel(src) /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) return ..() - damage(Proj.damage) + damage(proj_damage) return diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 5458f3da94..3f5508fb97 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -86,7 +86,7 @@ shatter(M) /obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() check_health() return diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index bc6217f774..5d5b88b886 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -29,7 +29,7 @@ /obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() ..() src.healthcheck() return diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 35a28558ae..744e277d9b 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -27,11 +27,10 @@ if(Proj.original != src && !prob(cover)) return PROJECTILE_CONTINUE //pass through - //Tasers and the like should not damage girders. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) + var/damage = Proj.get_structure_damage() + if(!damage) return - var/damage = Proj.damage if(!istype(Proj, /obj/item/projectile/beam)) damage *= 0.4 //non beams do reduced damage diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 149d6bf394..e1b3d2f2c7 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -64,13 +64,11 @@ /obj/structure/grille/bullet_act(var/obj/item/projectile/Proj) if(!Proj) return - //Tasers and the like should not damage grilles. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - //Flimsy grilles aren't so great at stopping projectiles. However they can absorb some of the impact - var/damage = Proj.damage + var/damage = Proj.get_structure_damage() var/passthrough = 0 + + if(!damage) return //20% chance that the grille provides a bit more cover than usual. Support structure for example might take up 20% of the grille's area. //If they click on the grille itself then we assume they are aiming at the grille itself and the extra cover behaviour is always used. diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index f31b098b5b..c6b108825b 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -38,10 +38,10 @@ return 0 /obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) return - health -= Proj.damage + health -= proj_damage ..() if(health <= 0) deflate(1) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 4a4ea63276..4baf5944df 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -30,10 +30,8 @@ /obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return - - if(prob(Proj.damage * 2)) + + if(prob(Proj.get_structure_damage() * 2)) if(!shattered) shatter() else diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 1fec557b8d..cc123ca1af 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -99,12 +99,11 @@ /obj/structure/window/bullet_act(var/obj/item/projectile/Proj) - //Tasers and the like should not damage windows. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/proj_damage = Proj.get_structure_damage() + if(!proj_damage) return ..() - take_damage(Proj.damage) + take_damage(proj_damage) return diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 782be35e6e..ce764cd634 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -49,12 +49,10 @@ var/list/global/wall_cache = list() else if(istype(Proj,/obj/item/projectile/ion)) burn(500) - // Tasers and stuff? No thanks. Also no clone or tox damage crap. - if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - return + var/proj_damage = Proj.get_structure_damage() //cap the amount of damage, so that things like emitters can't destroy walls in one hit. - var/damage = min(Proj.damage, 100) + var/damage = min(proj_damage, 100) take_damage(damage) return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 37a8468e31..8894049549 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -89,6 +89,11 @@ return 0 return 1 +/obj/item/projectile/proc/get_structure_damage() + if(damage_type == BRUTE || damage_type == BURN) + return damage + return 0 + //return 1 if the projectile should be allowed to pass through after all, 0 if not. /obj/item/projectile/proc/check_penetrate(var/atom/A) return 1 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 14cbd72d60..536e661f12 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -77,11 +77,14 @@ . = ..() bumped = 0 //can hit all mobs in a tile. pellets is decremented inside attack_mob so this should be fine. +/obj/item/projectile/bullet/pellet/proc/get_pellets(var/distance) + var/pellet_loss = round((distance - 1)/range_step) //pellets lost due to distance + return max(pellets - pellet_loss, 1) + /obj/item/projectile/bullet/pellet/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier) if (pellets < 0) return 1 - var/pellet_loss = round((distance - 1)/range_step) //pellets lost due to distance - var/total_pellets = max(pellets - pellet_loss, 1) + var/total_pellets = get_pellets(distance) var/spread = max(base_spread - (spread_step*distance), 0) //shrapnel explosions miss prone mobs with a chance that increases with distance @@ -106,6 +109,10 @@ return 1 return 0 +/obj/item/projectile/bullet/pellet/get_structure_damage() + var/distance = get_dist(loc, starting) + return ..() * get_pellets(distance) + /obj/item/projectile/bullet/pellet/Move() . = ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 9f4905540b..7406dff6b7 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -146,7 +146,7 @@ /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage_type == BRUTE || Proj.damage_type == BURN) + if(Proj.get_structure_damage()) if(istype(Proj.firer)) message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm index ccd8293ed0..ac56d07f99 100644 --- a/code/modules/research/xenoarchaeology/machinery/coolant.dm +++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm @@ -9,7 +9,7 @@ reagents.add_reagent("coolant",1000) /obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj) - if(Proj.damage_type == BRUTE || Proj.damage_type == BURN) + if(Proj.get_structure_damage()) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index cd6145d2f9..7b5449074f 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -60,7 +60,7 @@ ..() /obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage + health -= Proj.get_structure_damage() ..() check_failure() opacity = 1 diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 7b26e1696f..04b471182b 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -25,7 +25,7 @@ Stress(0.5 + severity) /obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj) - Stress(Proj.damage / 10) + Stress(Proj.get_structure_damage() / 10) /obj/effect/energy_field/proc/Stress(var/severity) strength -= severity diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 708798818a..696caa5ed4 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -214,7 +214,7 @@ ..() /obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj) - storedpower -= 400 * Proj.damage + storedpower -= 400 * Proj.get_structure_damage() ..() return @@ -285,7 +285,7 @@ G = gen_primary else G = gen_secondary - G.storedpower -= 400 * Proj.damage + G.storedpower -= 400 * Proj.get_structure_damage() ..() return diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 624f9f11b5..e7e66f7558 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -278,10 +278,11 @@ // Then bring it inside to explode instantly upon landing on a valid turf. + var/proj_damage = Proj.get_structure_damage() if(istype(Proj, /obj/item/projectile/beam)) - power += Proj.damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR + power += proj_damage * config_bullet_energy * CHARGING_FACTOR / POWER_FACTOR else - damage += Proj.damage * config_bullet_energy + damage += proj_damage * config_bullet_energy return 0 /obj/machinery/power/supermatter/attack_robot(mob/user as mob) diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 953dc519ea..3862632916 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -112,8 +112,7 @@ ..() /obj/vehicle/bullet_act(var/obj/item/projectile/Proj) - if (Proj.damage_type == BRUTE || Proj.damage_type == BURN) - health -= Proj.damage + health -= Proj.get_structure_damage() ..() healthcheck()