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()