mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Structures now take damage properly from projectile clouds
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
..()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -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]).")
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user