Skip to content

Commit

Permalink
Items and machines use shared damage proc.
Browse files Browse the repository at this point in the history
  • Loading branch information
MistakeNot4892 committed Oct 10, 2023
1 parent 70d0d0d commit 9474a6b
Show file tree
Hide file tree
Showing 24 changed files with 60 additions and 61 deletions.
4 changes: 2 additions & 2 deletions code/datums/extensions/assembly/assembly_damage.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
uninstall_component(null, P)
P.forceMove(H.loc)
if(prob(25))
P.take_item_damage(rand(10,30))
P.take_damage(rand(10,30), /decl/damage_handler/brute)
H.physically_destroyed()
qdel(src)

Expand All @@ -30,7 +30,7 @@
if(component_probability)
for(var/obj/item/stock_parts/computer/H in get_all_components())
if(prob(component_probability))
H.take_item_damage(round(amount / 2))
H.take_damage(round(amount / 2), /decl/damage_handler/brute)

if(damage >= max_damage)
break_apart()
Expand Down
26 changes: 13 additions & 13 deletions code/game/machinery/_machines_base/machinery_damage.dm
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/obj/machinery/proc/take_machinery_damage(amount, damtype = /decl/damage_handler/brute, silent = FALSE)
/obj/machinery/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
//Let's not bother initializing all the components for nothing
if(amount <= 0)
if(damage <= 0)
return
var/decl/damage_handler/damage_type_data = GET_DECL(damtype)
if(!damage_type_data.applies_to_machinery)
Expand All @@ -13,24 +13,24 @@
var/list/shielding = get_all_components_of_type(/obj/item/stock_parts/shielding)
for(var/obj/item/stock_parts/shielding/soak in shielding)
if(soak.is_functional() && (damtype in soak.protection_types))
amount -= soak.take_item_damage(amount, damtype)
if(amount <= 0)
damage -= soak.take_damage(damage, damtype)
if(damage <= 0)
return

// If some damage got past, next it's generic (non-circuitboard) components
var/obj/item/stock_parts/victim = get_damageable_component(damtype)
while(amount > 0 && victim)
amount -= victim.take_item_damage(amount, damtype)
while(damage > 0 && victim)
damage -= victim.take_damage(damage, damtype)
victim = get_damageable_component(damtype)
if(amount <= 0)
if(damage <= 0)
return

// And lastly hit the circuitboard
victim = get_component_of_type(/obj/item/stock_parts/circuitboard)
if(victim?.can_take_damage() && victim.is_functional())
amount -= victim.take_item_damage(amount, damtype)
damage -= victim.take_damage(damage, damtype)

if(amount)
if(damage)
dismantle()

/obj/machinery/proc/get_damageable_component(var/damage_type)
Expand Down Expand Up @@ -64,7 +64,7 @@
if(use_power && stat == 0)
new /obj/effect/temp_visual/emp_burst(loc)
use_power_oneoff(7500/severity)
take_machinery_damage(100/severity, /decl/damage_handler/electrocute)
take_damage(100/severity, /decl/damage_handler/electrocute)
..()

/obj/machinery/explosion_act(severity)
Expand All @@ -73,16 +73,16 @@
if((severity == 1 || (severity == 2 && prob(25))))
physically_destroyed()
else
take_machinery_damage(100/severity, /decl/damage_handler/brute, TRUE)
take_damage(100/severity, /decl/damage_handler/brute, silent = TRUE)

/obj/machinery/bullet_act(obj/item/projectile/P, def_zone)
. = ..()
take_machinery_damage(P.damage, P.damage_type)
take_damage(P.damage, P.damage_type, damage_flags = P.damage_flags)

/obj/machinery/bash(obj/item/W, mob/user)
if(!istype(W) || W.force <= 5 || (W.item_flags & ITEM_FLAG_NO_BLUDGEON))
return FALSE
. = ..()
if(.)
user.setClickCooldown(W.attack_cooldown + W.w_class)
take_machinery_damage(W.force, W.damtype)
take_damage(W.force, W.damtype)
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
// RefreshParts has been called, likely meaning other componenets were added/removed.
/obj/item/stock_parts/proc/on_refresh(var/obj/machinery/machine)

/obj/item/stock_parts/take_item_damage(damage, damage_type, damage_flags, inflicter, armor_pen)
/obj/item/stock_parts/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
if(damage_type in ignore_damage_types)
return
. = ..()
Expand Down
6 changes: 3 additions & 3 deletions code/game/machinery/camera/camera.dm
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@
START_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF)

/obj/machinery/camera/bullet_act(var/obj/item/projectile/P)
take_machinery_damage(P.get_structure_damage())
take_damage(P.get_structure_damage(), P.damage_type, damage_flags = P.damage_flags)

/obj/machinery/camera/explosion_act(severity)
..()
Expand All @@ -192,7 +192,7 @@
var/obj/O = AM
if (O.throwforce >= src.toughness)
visible_message(SPAN_WARNING("[src] was hit by [O]!"))
take_machinery_damage(O.throwforce)
take_damage(O.throwforce, /decl/damage_handler/brute)

/obj/machinery/camera/physical_attack_hand(mob/living/carbon/human/user)
if(!istype(user))
Expand All @@ -202,7 +202,7 @@
visible_message(SPAN_WARNING("\The [user] slashes at [src]!"))
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
add_hiddenprint(user)
take_machinery_damage(25)
take_damage(25)
return TRUE

/obj/machinery/camera/attackby(obj/item/W, mob/user)
Expand Down
10 changes: 5 additions & 5 deletions code/game/machinery/doors/_door.dm
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@

if(damage >= 10)
visible_message("<span class='danger'>\The [user] [attack_verb] into \the [src]!</span>")
take_machinery_damage(damage)
take_damage(damage, /decl/damage_handler/brute)
else
visible_message("<span class='notice'>\The [user] bonks \the [src] harmlessly.</span>")
attack_animation(user)
Expand Down Expand Up @@ -213,7 +213,7 @@

if(damage)
//cap projectile damage so that there's still a minimum number of hits required to break the door
take_machinery_damage(min(damage, 100), Proj.damage_type)
take_damage(min(damage, 100), Proj.damage_type, Proj.damage_flags)

/obj/machinery/door/hitby(var/atom/movable/AM, var/datum/thrownthing/TT)
..()
Expand All @@ -224,7 +224,7 @@
else
tforce = AM:throwforce * (TT.speed/THROWFORCE_SPEED_DIVISOR)
playsound(src.loc, hitsound, 100, 1)
take_machinery_damage(tforce)
take_damage(tforce, /decl/damage_handler/brute)

// This is legacy code that should be revisited, probably by moving the bulk of the logic into here.
/obj/machinery/door/physical_attack_hand(user)
Expand Down Expand Up @@ -320,11 +320,11 @@
else
user.visible_message("<span class='danger'>\The [user] forcefully strikes \the [src] with \the [I]!</span>")
playsound(src.loc, hitsound, 100, 1)
take_machinery_damage(I.force, I.damtype)
take_damage(I.force, I.damtype)
return TRUE
return FALSE

/obj/machinery/door/take_machinery_damage(var/damage, damtype=/decl/damage_handler/brute)
/obj/machinery/door/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
if(!health)
..(damage, damtype)
update_icon()
Expand Down
8 changes: 4 additions & 4 deletions code/game/machinery/doors/airlock.dm
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ About the new airlock wires panel:
else if(!repairing)
// Add some minor damage as evidence of forcing.
if(health >= maxhealth)
take_machinery_damage(1)
take_damage(1, /decl/damage_handler/brute)
if(arePowerSystemsOn())
to_chat(user, SPAN_WARNING("The airlock's motors resist your efforts to force it."))
else if(locked)
Expand Down Expand Up @@ -937,7 +937,7 @@ About the new airlock wires panel:
for(var/turf/turf in locs)
for(var/atom/movable/AM in turf)
if(AM.airlock_crush(door_crush_damage))
take_machinery_damage(door_crush_damage)
take_damage(door_crush_damage, /decl/damage_handler/brute)
use_power_oneoff(door_crush_damage * 100) // Uses bunch extra power for crushing the target.

use_power_oneoff(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
Expand Down Expand Up @@ -1069,9 +1069,9 @@ About the new airlock wires panel:
return

// Braces can act as an extra layer of armor - they will take damage first.
/obj/machinery/door/airlock/take_machinery_damage(var/amount, damtype=/decl/damage_handler/brute)
/obj/machinery/door/airlock/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
if(brace)
brace.take_item_damage(amount)
brace.take_damage(damage, damtype)
else
..()
update_icon()
Expand Down
2 changes: 1 addition & 1 deletion code/game/machinery/doors/airlock_interactions.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage)
. = ..()
take_machinery_damage(crush_damage)
take_damage(crush_damage, /decl/damage_handler/brute)

/obj/effect/energy_field/airlock_crush(var/crush_damage)
Stress(crush_damage)
Expand Down
4 changes: 2 additions & 2 deletions code/game/machinery/doors/windowdoor.dm
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@

return TRUE

/obj/machinery/door/window/take_machinery_damage(var/damage)
/obj/machinery/door/window/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
src.health = max(0, src.health - damage)
if (src.health <= 0)
shatter()
Expand All @@ -143,7 +143,7 @@
if(H.species.can_shred(H))
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("<span class='danger'>[user] smashes against the [src.name].</span>", 1)
take_machinery_damage(25)
take_damage(25, /decl/damage_handler/brute)
return TRUE
return ..()

Expand Down
18 changes: 9 additions & 9 deletions code/game/machinery/portable_turret.dm
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ var/global/list/turret_icons
else
//if the turret was attacked with the intention of harming it:
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
take_machinery_damage(I.force * 0.5)
take_damage(I.force * 0.5, /decl/damage_handler/brute)
if(I.force * 0.5 > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off
if(!attacked && !emagged)
attacked = 1
Expand All @@ -326,14 +326,14 @@ var/global/list/turret_icons
enabled = 1 //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
return 1

/obj/machinery/porta_turret/take_machinery_damage(var/force)
/obj/machinery/porta_turret/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
if(!raised && !raising)
force = force / 8
if(force < 5)
damage = damage / 8
if(damage < 5)
return

health -= force
if (force > 5 && prob(45))
health -= damage
if (damage > 5 && prob(45))
spark_at(src, amount = 5)
if(health <= 0)
die() //the death process :(
Expand All @@ -353,7 +353,7 @@ var/global/list/turret_icons

..()

take_machinery_damage(damage)
take_damage(damage, /decl/damage_handler/brute)

/obj/machinery/porta_turret/emp_act(severity)
if(enabled)
Expand Down Expand Up @@ -383,9 +383,9 @@ var/global/list/turret_icons
if(severity == 1 || (severity == 2 && prob(25)))
physically_destroyed()
else if(severity == 2)
take_machinery_damage(initial(health) * 8)
take_damage(initial(health) * 8, /decl/damage_handler/brute)
else
take_machinery_damage(initial(health) * 8 / 3)
take_damage(initial(health) * 8 / 3, /decl/damage_handler/brute)

/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
health = 0
Expand Down
6 changes: 3 additions & 3 deletions code/game/objects/item_damage.dm
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/**Basic damage handling for items. Returns the amount of damage taken after armor if the item was damaged.*/
/obj/item/proc/take_item_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/damage_flags = 0, var/inflicter = null, var/armor_pen = 0)
/obj/item/take_damage(var/damage, var/damage_type = /decl/damage_handler/brute, var/def_zone = null, var/damage_flags = 0, var/used_weapon = null, var/armor_pen, var/silent = FALSE, var/override_droplimb)
if(!can_take_damage()) // This object does not take damage.
return 0 //Must return a number
if(damage < 0)
CRASH("Item '[type]' take_item_damage proc was called with negative damage.") //Negative damage are an implementation issue.
CRASH("Item '[type]' take_damage proc was called with negative damage.") //Negative damage are an implementation issue.

//Apply armor
var/datum/extension/armor/A = get_extension(src, /datum/extension/armor)
Expand Down Expand Up @@ -31,7 +31,7 @@
if(QDELETED(src))
return
. = ..()
take_item_damage(explosion_severity_damage(severity), /decl/damage_handler/burn, DAM_EXPLODE | DAM_DISPERSED, "explosion")
take_damage(explosion_severity_damage(severity), /decl/damage_handler/burn, damage_flags = (DAM_EXPLODE | DAM_DISPERSED), used_weapon = "explosion")

/obj/item/proc/explosion_severity_damage(var/severity)
var/mult = explosion_severity_damage_multiplier()
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/material/ashtray.dm
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
dump_contents()
remove_extension(src, /datum/extension/scent)
update_icon()
take_item_damage(3, /decl/damage_handler/brute, 0, hit_atom)
take_damage(3, /decl/damage_handler/brute, used_weapon = hit_atom)

/obj/item/ashtray/plastic
material = /decl/material/solid/plastic
Expand Down
2 changes: 1 addition & 1 deletion code/modules/blob/blob.dm
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@
return
var/obj/machinery/camera/CA = locate() in T
if(CA)
CA.take_machinery_damage(30)
CA.take_damage(30, /decl/damage_handler/brute)
return

// Above things, we destroy completely and thus can use locate. Mobs are different.
Expand Down
2 changes: 1 addition & 1 deletion code/modules/clothing/shoes/_shoes.dm
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@

/obj/item/clothing/shoes/proc/handle_movement(var/turf/walking, var/running)
if (attached_cuffs && running)
attached_cuffs.take_item_damage(1, armor_pen = 100)
attached_cuffs.take_damage(1, /decl/damage_handler/brute, armor_pen = 100)
if(QDELETED(attached_cuffs))
verbs -= /obj/item/clothing/shoes/proc/remove_cuffs
attached_cuffs = null
Expand Down
2 changes: 1 addition & 1 deletion code/modules/events/camera_damage.dm
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
for(var/obj/machinery/camera/cam in range(severity_range,C))
if(is_valid_camera(cam))
if(prob(2*severity))
cam.take_machinery_damage(100, /decl/damage_handler/electrocute, TRUE)
cam.take_damage(100, /decl/damage_handler/electrocute, silent = TRUE)
else
if(!cam.wires.IsIndexCut(CAMERA_WIRE_POWER))
cam.wires.CutWireIndex(CAMERA_WIRE_POWER)
Expand Down
2 changes: 1 addition & 1 deletion code/modules/events/computer_damage.dm
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@
if(prob(50))
victim.visible_message("<span class='warning'>[victim] emits some ominous clicks.</span>")
var/obj/item/stock_parts/computer/hard_drive/HDD = victim.get_component_of_type(/obj/item/stock_parts/computer/hard_drive)
HDD.take_item_damage(0.5 * HDD.health)
HDD.take_damage(0.5 * HDD.health, /decl/damage_handler/brute)
3 changes: 1 addition & 2 deletions code/modules/holodeck/HolodeckObjects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,7 @@
var/aforce = I.force
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("<span class='danger'>\The [src] was hit by \the [I].</span>")
if(I.damtype == /decl/damage_handler/brute || I.damtype == /decl/damage_handler/burn)
take_machinery_damage(aforce)
take_damage(aforce, I.damtype)
return

src.add_fingerprint(user)
Expand Down
2 changes: 1 addition & 1 deletion code/modules/integrated_electronics/core/assemblies.dm
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@
interact(user)

/obj/item/electronic_assembly/bullet_act(var/obj/item/projectile/P)
take_item_damage(P.damage)
take_damage(P.damage, P.damage_type, damage_flags = P.damage_flags)

/obj/item/electronic_assembly/emp_act(severity)
. = ..()
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/carbon/resist.dm
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
return
if (cuffs.can_take_damage() && cuffs.health > 0) // Improvised cuffs can break because their health is > 0
var/cuffs_name = "\the [cuffs]"
cuffs.take_item_damage(cuffs.max_health / 2)
cuffs.take_damage(cuffs.max_health / 2, /decl/damage_handler/brute)
if (QDELETED(cuffs) || cuffs.health < 1)
visible_message(
SPAN_DANGER("\The [src] manages to remove [cuffs_name], breaking them!"),
Expand Down
4 changes: 2 additions & 2 deletions code/modules/modular_computers/os/_os.dm
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,10 @@
if(hard_drive)
if(prob(10))
hard_drive.visible_message("<span class='warning'>[src] emits some ominous clicks.</span>")
hard_drive.take_item_damage(0.5 * hard_drive.health)
hard_drive.take_damage(0.5 * hard_drive.health, /decl/damage_handler/brute)
else if(prob(5))
hard_drive.visible_message("<span class='warning'>[src] emits some ominous clicks.</span>")
hard_drive.take_item_damage(hard_drive.health)
hard_drive.take_damage(hard_drive.health, /decl/damage_handler/brute)
update_host_icon()

/datum/extension/interactive/os/proc/system_boot()
Expand Down
4 changes: 2 additions & 2 deletions code/modules/overmap/internet/internet_uplink.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ var/global/list/internet_uplinks = list()

var/datum/gas_mixture/env = return_air()
if(!istype(env) || env.return_pressure() < 10) // Vacuum cooling is insufficient for this machine.
take_machinery_damage(10, /decl/damage_handler/burn)
take_damage(10, /decl/damage_handler/burn)
return
env.add_thermal_energy(active_power_usage * inefficiency)
if(env.temperature > max_temperature)
take_machinery_damage(5, /decl/damage_handler/burn)
take_damage(5, /decl/damage_handler/burn)

/obj/machinery/internet_uplink/set_broken(new_state, cause)
. = ..()
Expand Down
Loading

0 comments on commit 9474a6b

Please sign in to comment.