Structures now take damage properly from projectile clouds

This commit is contained in:
mwerezak
2015-08-15 19:08:45 -04:00
parent a773715ff9
commit 77ddae4e26
25 changed files with 57 additions and 57 deletions

View File

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

View File

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

View File

@@ -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("<span class='danger'>\The [src.name] disintegrates!</span>")
@@ -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))

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()
. = ..()

View File

@@ -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]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[loc.x];Y=[loc.y];Z=[loc.z]'>JMP</a>).")
log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).")

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

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

View File

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