From 3ad9fb2f1f838988abae7ed7a4b31391a60b63f2 Mon Sep 17 00:00:00 2001
From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com>
Date: Sat, 7 Dec 2024 13:25:43 -0500
Subject: [PATCH] Refactors armor into subtypes. Kills a very hot proc.
(#11742)
* permeability
* change armor
* addarmordatums
* remove lists
* completion
* we love lists
* unit test
* byebye
* try otherwise
* why dont you listen
* hmm
* try passing penetration?
* fixed bad uses of atom armor
* ur dumb
* hmm
* kick it
* man im dumb
* checkfix
* oops
---
_maps/map_files/CorgStation/CorgStation.dmm | 88 ++-
.../map_files/Deltastation/DeltaStation2.dmm | 260 ++++---
.../emergency/emergency_discoinferno.dmm | 1 -
beestation.dme | 3 +-
code/__DEFINES/combat.dm | 20 +-
code/__DEFINES/vv.dm | 2 +-
code/datums/armor.dm | 76 ---
code/datums/armor/_armor.dm | 251 +++++++
code/datums/armor/_atom_armor.dm | 26 +
code/datums/components/armor_plate.dm | 18 +-
code/datums/components/infective.dm | 14 +-
code/datums/datum.dm | 7 +
code/datums/diseases/_MobProcs.dm | 92 ++-
code/datums/diseases/_disease.dm | 31 +-
code/datums/diseases/advance/advance.dm | 2 +-
code/datums/diseases/appendicitis.dm | 2 +-
code/datums/diseases/cold.dm | 2 +-
code/datums/diseases/flu.dm | 2 +-
code/datums/diseases/fluspanish.dm | 2 +-
code/datums/diseases/gbs.dm | 2 +-
code/datums/diseases/heart_failure.dm | 2 +-
code/datums/diseases/magnitis.dm | 2 +-
code/datums/diseases/pierrot_throat.dm | 2 +-
code/datums/diseases/retrovirus.dm | 2 +-
code/datums/diseases/rhumba_beat.dm | 2 +-
code/datums/diseases/wizarditis.dm | 2 +-
code/datums/martial/krav_maga.dm | 8 +-
code/datums/materials/_material.dm | 13 +-
code/game/atom_defense.dm | 21 +-
code/game/atoms.dm | 39 +-
.../game/gamemodes/clown_ops/clown_weapons.dm | 30 +-
code/game/machinery/_machinery.dm | 11 +-
code/game/machinery/ai_slipper.dm | 11 +-
code/game/machinery/airlock_cycle_control.dm | 10 +-
code/game/machinery/buttons.dm | 13 +-
code/game/machinery/camera/camera.dm | 17 +-
code/game/machinery/computer/_computer.dm | 6 +-
code/game/machinery/doors/airlock_types.dm | 4 +-
code/game/machinery/doors/door.dm | 13 +-
code/game/machinery/doors/firedoor.dm | 13 +-
code/game/machinery/doors/poddoor.dm | 13 +-
code/game/machinery/doors/shutters.dm | 12 +
code/game/machinery/doors/windowdoor.dm | 23 +-
code/game/machinery/firealarm.dm | 8 +-
code/game/machinery/flasher.dm | 6 +-
code/game/machinery/hologram.dm | 10 +-
code/game/machinery/igniter.dm | 12 +-
code/game/machinery/mass_driver.dm | 13 +
code/game/machinery/navbeacon.dm | 11 +-
.../newscaster/newscaster_machine.dm | 8 +-
.../machinery/porta_turret/portable_turret.dm | 24 +-
code/game/machinery/portable_thermomachine.dm | 8 +-
code/game/machinery/requests_console.dm | 11 +-
code/game/machinery/shuttle/shuttle_heater.dm | 10 +-
.../telecomms/machines/message_server.dm | 10 +-
code/game/objects/items.dm | 5 -
code/game/objects/items/RCD.dm | 7 +-
code/game/objects/items/RPD.dm | 7 +-
code/game/objects/items/RSF.dm | 2 +-
code/game/objects/items/cards_ids.dm | 13 +-
code/game/objects/items/crab17.dm | 12 +-
code/game/objects/items/debug_items.dm | 33 +-
code/game/objects/items/defib.dm | 7 +-
.../objects/items/deployable/barricade.dm | 12 +-
.../items/devices/forcefieldprojector.dm | 12 +-
code/game/objects/items/dualsaber.dm | 7 +-
code/game/objects/items/fireaxe.dm | 7 +-
code/game/objects/items/handcuffs.dm | 7 +-
code/game/objects/items/kitchen.dm | 7 +-
code/game/objects/items/knives.dm | 9 +-
code/game/objects/items/melee/energy.dm | 7 +-
code/game/objects/items/melee/misc.dm | 7 +-
code/game/objects/items/pitchfork.dm | 7 +-
code/game/objects/items/pneumaticCannon.dm | 7 +-
code/game/objects/items/powerfist.dm | 7 +-
code/game/objects/items/religion.dm | 14 +-
code/game/objects/items/singularityhammer.dm | 11 +-
code/game/objects/items/spear.dm | 7 +-
.../items/stacks/sheets/mineral/glass.dm | 52 +-
.../items/stacks/sheets/mineral/metals.dm | 7 +-
.../items/stacks/sheets/organic/wood.dm | 12 +-
.../objects/items/stacks/tiles/tile_iron.dm | 7 +-
code/game/objects/items/storage/backpack.dm | 21 +-
code/game/objects/items/storage/secure.dm | 13 +-
code/game/objects/items/stunbaton.dm | 8 +-
code/game/objects/items/tanks/tanks.dm | 8 +-
code/game/objects/items/tanks/watertank.dm | 7 +-
code/game/objects/items/teleportation.dm | 8 +-
code/game/objects/items/tools/crowbar.dm | 7 +-
code/game/objects/items/tools/powertools.dm | 7 +-
code/game/objects/items/tools/screwdriver.dm | 7 +-
code/game/objects/items/tools/weldingtool.dm | 7 +-
code/game/objects/items/tools/wirecutters.dm | 7 +-
code/game/objects/items/tools/wrench.dm | 7 +-
code/game/objects/items/vending_items.dm | 7 +-
code/game/objects/items/weaponry.dm | 28 +-
code/game/objects/obj_defense.dm | 4 +-
code/game/objects/objs.dm | 33 +-
code/game/objects/structures.dm | 8 +-
code/game/objects/structures/barsigns.dm | 11 +-
.../structures/crates_lockers/closets.dm | 11 +-
.../closets/secure/secure_closets.dm | 11 +-
.../crates_lockers/crates/secure.dm | 15 +-
code/game/objects/structures/displaycase.dm | 9 +-
code/game/objects/structures/fireaxe.dm | 12 +-
code/game/objects/structures/grille.dm | 13 +-
code/game/objects/structures/holosign.dm | 10 +-
code/game/objects/structures/lattice.dm | 8 +-
code/game/objects/structures/mineral_doors.dm | 11 +-
code/game/objects/structures/plasticflaps.dm | 13 +-
code/game/objects/structures/railings.dm | 11 +
code/game/objects/structures/signs/_signs.dm | 8 +-
code/game/objects/structures/tables_racks.dm | 29 +-
code/game/objects/structures/window.dm | 72 +-
code/game/shuttle_engines.dm | 10 +-
code/game/turfs/open/lava.dm | 4 +-
code/game/turfs/turf.dm | 6 +-
code/game/turfs/turf_integrity.dm | 11 +-
.../abductor/equipment/abduction_gear.dm | 43 +-
code/modules/antagonists/blob/blob_mobs.dm | 3 +-
.../antagonists/blob/blobstrains/_reagent.dm | 8 +-
.../blob/blobstrains/explosive_lattice.dm | 2 +-
.../antagonists/blob/structures/_blob.dm | 9 +-
.../antagonists/blob/structures/core.dm | 7 +-
.../antagonists/blob/structures/node.dm | 7 +-
.../antagonists/blob/structures/shield.dm | 7 +-
.../changeling/powers/mutations.dm | 62 +-
.../antagonists/clock_cult/clockwork_turfs.dm | 12 +-
.../clock_cult/items/brass_clothing.dm | 74 +-
.../clock_cult/scriptures/ocular_warden.dm | 10 +-
code/modules/antagonists/cult/cult_items.dm | 112 ++-
.../heretic/items/heretic_armor.dm | 40 +-
.../nukeop/equipment/nuclearbomb.dm | 8 +-
.../antagonists/revenant/revenant_blight.dm | 2 +-
.../antagonists/space_dragon/carp_rift.dm | 10 +-
.../atmospherics/machinery/airalarm.dm | 9 +-
.../atmospherics/machinery/atmosmachinery.dm | 21 +-
.../machinery/components/components_base.dm | 4 -
.../components/unary_devices/cryo.dm | 9 +-
.../components/unary_devices/thermomachine.dm | 9 +-
.../atmospherics/machinery/other/meter.dm | 8 +-
.../atmospherics/machinery/pipes/pipes.dm | 10 +-
.../machinery/portable/canister.dm | 13 +-
.../portable/portable_atmospherics.dm | 9 +-
code/modules/cargo/supplypod.dm | 12 +-
code/modules/clothing/chameleon.dm | 118 +++-
code/modules/clothing/clothing.dm | 64 +-
code/modules/clothing/glasses/_glasses.dm | 14 +-
code/modules/clothing/gloves/color.dm | 33 +-
code/modules/clothing/gloves/miscellaneous.dm | 34 +-
code/modules/clothing/head/beanie.dm | 14 +-
code/modules/clothing/head/cakehat.dm | 2 +-
code/modules/clothing/head/costume.dm | 63 +-
code/modules/clothing/head/crown.dm | 10 +-
code/modules/clothing/head/hardhat.dm | 24 +-
code/modules/clothing/head/hat.dm | 33 +-
code/modules/clothing/head/helmet.dm | 215 +++++-
code/modules/clothing/head/jobs.dm | 330 ++++++++-
code/modules/clothing/head/misc_special.dm | 9 +-
code/modules/clothing/head/soft_caps.dm | 14 +-
code/modules/clothing/head/tinfoilhat.dm | 17 +-
code/modules/clothing/masks/_masks.dm | 2 -
code/modules/clothing/masks/breath.dm | 12 +-
code/modules/clothing/masks/gasmask.dm | 18 +-
code/modules/clothing/masks/hailer.dm | 14 +-
code/modules/clothing/masks/miscellaneous.dm | 7 +-
code/modules/clothing/shoes/_shoes.dm | 6 +-
code/modules/clothing/shoes/color.dm | 14 +-
code/modules/clothing/shoes/magboots.dm | 22 +-
code/modules/clothing/shoes/miscellaneous.dm | 78 ++-
.../clothing/spacesuits/_spacesuits.dm | 24 +-
.../modules/clothing/spacesuits/chronosuit.dm | 19 +-
code/modules/clothing/spacesuits/hardsuit.dm | 644 ++++++++++++++++--
.../clothing/spacesuits/miscellaneous.dm | 240 ++++++-
code/modules/clothing/spacesuits/plasmamen.dm | 70 +-
code/modules/clothing/spacesuits/swat.dm | 15 +-
code/modules/clothing/spacesuits/syndi.dm | 32 +-
code/modules/clothing/suits/_suits.dm | 6 +-
code/modules/clothing/suits/armor.dm | 234 ++++++-
code/modules/clothing/suits/bio.dm | 54 +-
code/modules/clothing/suits/chaplainsuits.dm | 76 ++-
code/modules/clothing/suits/cloaks.dm | 88 ++-
code/modules/clothing/suits/costume.dm | 32 +-
code/modules/clothing/suits/donator.dm | 6 +-
code/modules/clothing/suits/hoodies.dm | 30 +-
code/modules/clothing/suits/jacket.dm | 12 +-
code/modules/clothing/suits/jobs.dm | 41 +-
code/modules/clothing/suits/labcoat.dm | 20 +-
.../modules/clothing/suits/reactive_armour.dm | 8 +-
code/modules/clothing/suits/utility.dm | 68 +-
code/modules/clothing/suits/wetfloor.dm | 6 +-
code/modules/clothing/suits/wintercoats.dm | 196 +++++-
code/modules/clothing/suits/wiz_robe.dm | 78 ++-
code/modules/clothing/under/_under.dm | 8 +-
code/modules/clothing/under/accessories.dm | 51 +-
code/modules/clothing/under/color.dm | 28 +-
code/modules/clothing/under/costume.dm | 10 +-
.../under/jobs/Plasmaman/civilian_service.dm | 8 +-
.../under/jobs/Plasmaman/engineering.dm | 10 +-
.../clothing/under/jobs/Plasmaman/security.dm | 22 +-
code/modules/clothing/under/jobs/cargo.dm | 7 +
.../clothing/under/jobs/civilian/civilian.dm | 13 +-
.../clothing/under/jobs/civilian/curator.dm | 6 +-
code/modules/clothing/under/jobs/command.dm | 11 +-
.../clothing/under/jobs/engineering.dm | 37 +-
code/modules/clothing/under/jobs/medical.dm | 28 +-
code/modules/clothing/under/jobs/rnd.dm | 34 +-
code/modules/clothing/under/jobs/security.dm | 51 +-
code/modules/clothing/under/miscellaneous.dm | 18 +-
code/modules/clothing/under/syndicate.dm | 38 +-
code/modules/clothing/under/trek.dm | 8 +-
code/modules/events/holiday/xmas.dm | 27 +-
code/modules/events/wizard/rpgloot.dm | 2 +-
.../kitchen_machinery/deep_fryer.dm | 14 +-
code/modules/library/lib_items.dm | 6 +-
.../modules/mining/equipment/explorer_gear.dm | 82 ++-
.../mining/equipment/marker_beacons.dm | 13 +-
.../mining/lavaland/necropolis_chests.dm | 14 +-
.../living/carbon/alien/humanoid/humanoid.dm | 3 -
code/modules/mob/living/carbon/carbon.dm | 11 -
.../mob/living/carbon/human/human_defense.dm | 4 +-
.../mob/living/carbon/human/physiology.dm | 51 +-
.../carbon/human/species_types/golems.dm | 12 +-
.../carbon/human/species_types/snail.dm | 9 +-
code/modules/mob/living/living.dm | 4 -
.../mob/living/simple_animal/friendly/dog.dm | 8 +-
.../friendly/drone/interaction.dm | 2 +-
.../hostile/mining_mobs/elites/elite.dm | 14 +-
.../computers/item/computer.dm | 9 +-
code/modules/ninja/suit/gloves.dm | 12 +
code/modules/ninja/suit/head.dm | 16 +-
code/modules/ninja/suit/shoes.dm | 17 +-
code/modules/ninja/suit/suit.dm | 16 +-
code/modules/power/apc/apc_main.dm | 15 +-
code/modules/power/apc/apc_power_proc.dm | 4 +-
.../modules/power/lighting/light_construct.dm | 10 +-
.../power/singularity/field_generator.dm | 11 +-
.../particle_accelerator.dm | 10 +-
code/modules/reagents/chemistry/holder.dm | 2 +-
code/modules/reagents/chemistry/reagents.dm | 2 +-
.../chemistry/reagents/other_reagents.dm | 2 +-
.../reagents/reagent_containers/cups/_cup.dm | 8 +-
code/modules/recycling/disposal/bin.dm | 12 +-
code/modules/recycling/disposal/pipe.dm | 20 +-
.../nanites/nanite_programs/buffing.dm | 23 +-
.../nanites/nanite_programs/utility.dm | 4 +-
.../xenobiology/crossbreeding/_clothing.dm | 6 +-
.../xenobiology/crossbreeding/_misc.dm | 12 +-
.../xenobiology/crossbreeding/_weapons.dm | 12 +-
.../xenobiology/crossbreeding/warping.dm | 15 +-
.../modules/ruins/lavalandruin_code/puzzle.dm | 13 +-
code/modules/security/genpop.dm | 13 +-
.../shuttle_creation/shuttle_creator.dm | 7 +-
code/modules/unit_tests/_unit_tests.dm | 1 +
code/modules/unit_tests/armor_verification.dm | 33 +
code/modules/unit_tests/armour_checks.dm | 26 +-
code/modules/vehicles/_vehicle.dm | 11 +-
code/modules/vehicles/atv.dm | 11 +-
code/modules/vehicles/cars/clowncar.dm | 11 +-
code/modules/vehicles/mecha/_mecha.dm | 16 +-
code/modules/vehicles/mecha/combat/combat.dm | 12 +-
code/modules/vehicles/mecha/combat/durand.dm | 13 +-
code/modules/vehicles/mecha/combat/gygax.dm | 24 +-
code/modules/vehicles/mecha/combat/honker.dm | 20 +-
.../modules/vehicles/mecha/combat/marauder.dm | 13 +-
code/modules/vehicles/mecha/combat/phazon.dm | 13 +-
.../vehicles/mecha/combat/reticence.dm | 11 +-
code/modules/vehicles/mecha/working/clarke.dm | 13 +-
code/modules/vehicles/mecha/working/ripley.dm | 25 +-
code/modules/vehicles/secway.dm | 11 +-
code/modules/vehicles/wheelchair.dm | 11 +-
code/modules/vending/_vending.dm | 8 +-
code/modules/vending/liberation.dm | 10 +-
code/modules/vending/liberation_toy.dm | 11 +-
code/modules/vending/magivend.dm | 10 +-
code/modules/vending/medical.dm | 24 +-
code/modules/vending/medical_wall.dm | 10 +-
code/modules/vending/toys.dm | 10 +-
code/modules/vending/youtool.dm | 10 +-
279 files changed, 5866 insertions(+), 1178 deletions(-)
delete mode 100644 code/datums/armor.dm
create mode 100644 code/datums/armor/_armor.dm
create mode 100644 code/datums/armor/_atom_armor.dm
create mode 100644 code/modules/unit_tests/armor_verification.dm
diff --git a/_maps/map_files/CorgStation/CorgStation.dmm b/_maps/map_files/CorgStation/CorgStation.dmm
index 8bdb38852124a..429be5061eea2 100644
--- a/_maps/map_files/CorgStation/CorgStation.dmm
+++ b/_maps/map_files/CorgStation/CorgStation.dmm
@@ -11800,16 +11800,6 @@
/obj/effect/turf_decal/tile/blue/fourcorners/contrasted,
/turf/open/floor/iron/dark,
/area/bridge)
-"dJA" = (
-/obj/structure/sink{
- dir = 4;
- pixel_x = 11
- },
-/obj/structure/mirror{
- pixel_x = 28
- },
-/turf/open/floor/iron/white,
-/area/crew_quarters/toilet)
"dJE" = (
/obj/machinery/light_switch{
pixel_x = 1;
@@ -18972,6 +18962,15 @@
/obj/effect/turf_decal/tile/purple/opposingcorners,
/turf/open/floor/iron,
/area/science/lab)
+"gcM" = (
+/obj/machinery/power/supermatter_crystal/shard/engine{
+ moveable = 1
+ },
+/obj/machinery/mass_driver{
+ dir = 8
+ },
+/turf/open/floor/engine,
+/area/engine/supermatter)
"gde" = (
/obj/structure/cable/white,
/obj/machinery/power/terminal{
@@ -24500,6 +24499,21 @@
},
/turf/open/floor/iron/white,
/area/crew_quarters/heads/cmo)
+"hPY" = (
+/obj/structure/cable/yellow{
+ icon_state = "2-8"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/structure/cable/yellow{
+ icon_state = "2-4"
+ },
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
+/obj/effect/landmark/prisonspawn,
+/turf/open/floor/prison,
+/area/security/prison)
"hQj" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -39170,10 +39184,6 @@
},
/turf/open/floor/iron,
/area/hallway/primary/central)
-"myE" = (
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron/white,
-/area/crew_quarters/toilet)
"myH" = (
/obj/machinery/door/airlock/highsecurity{
name = "Gravity Generator Room";
@@ -46445,6 +46455,16 @@
/obj/structure/grille,
/turf/open/space/basic,
/area/space/nearstation)
+"oTD" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/obj/structure/mirror{
+ pixel_x = 28
+ },
+/turf/open/floor/iron/white,
+/area/crew_quarters/toilet)
"oTE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/item/radio/intercom{
@@ -47464,6 +47484,10 @@
/obj/machinery/atmospherics/pipe/manifold/supply/visible,
/turf/open/space/basic,
/area/space/nearstation)
+"poY" = (
+/obj/machinery/airalarm/directional/south,
+/turf/open/floor/iron/white,
+/area/crew_quarters/toilet)
"ppd" = (
/obj/structure/bodycontainer/morgue{
dir = 2
@@ -53862,21 +53886,6 @@
/obj/machinery/gateway/station,
/turf/open/floor/iron/dark,
/area/gateway)
-"ruI" = (
-/obj/structure/cable/yellow{
- icon_state = "2-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/structure/cable/yellow{
- icon_state = "2-4"
- },
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4,
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2,
-/obj/effect/landmark/prisonspawn,
-/turf/open/floor/prison,
-/area/security/prison)
"ruN" = (
/obj/effect/turf_decal/stripes/line{
dir = 10
@@ -61776,19 +61785,6 @@
},
/turf/open/floor/iron/white,
/area/science/research)
-"tZH" = (
-/obj/machinery/power/supermatter_crystal/shard/engine{
- moveable = 1
- },
-/obj/machinery/mass_driver{
- armor = list("melee"=10,"bullet"=10,"laser"=10,"energy"=0,"bomb"=0,"bio"=0,"rad"=0,"fire"=100,"acid"=70);
- critical_machine = 1;
- dir = 8;
- id = "smeject";
- name = "emergency supermatter ejection pad"
- },
-/turf/open/floor/engine,
-/area/engine/supermatter)
"tZK" = (
/obj/effect/turf_decal/tile/red/half/contrasted{
dir = 4
@@ -88643,7 +88639,7 @@ aPU
auG
aJW
aCQ
-tZH
+gcM
asE
agO
aju
@@ -101299,7 +101295,7 @@ vhc
aTr
dMx
bDY
-dJA
+oTD
hlt
hlt
hlt
@@ -102330,7 +102326,7 @@ vAt
lQt
vAt
fTf
-myE
+poY
auR
lWW
uIh
@@ -112305,7 +112301,7 @@ cUn
sgK
bBp
tZK
-ruI
+hPY
hce
vaO
vhS
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 4352e979368f3..8588a516f44f5 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -4243,43 +4243,6 @@
},
/turf/open/floor/iron,
/area/janitor)
-"aAm" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/vomit/old,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/obj/machinery/light/small,
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/crew_quarters/toilet/auxiliary)
-"aAn" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/obj/machinery/light/small,
-/obj/effect/turf_decal/bot,
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/crew_quarters/toilet/auxiliary)
-"aAo" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/obj/machinery/light/small,
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/bot,
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/crew_quarters/toilet/auxiliary)
"aAp" = (
/obj/machinery/vending/cigarette,
/obj/machinery/light/small,
@@ -6219,6 +6182,18 @@
/obj/structure/sign/warning/radiation,
/turf/closed/wall/r_wall,
/area/engine/atmos)
+"aMJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/newscaster{
+ pixel_x = -32
+ },
+/obj/machinery/light/small,
+/obj/effect/turf_decal/bot,
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/crew_quarters/toilet/restrooms)
"aMK" = (
/obj/structure/sign/warning/fire,
/turf/closed/wall/r_wall,
@@ -9354,6 +9329,25 @@
},
/turf/open/floor/iron,
/area/quartermaster/miningoffice)
+"bku" = (
+/obj/structure/table/wood,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/item/folder/blue,
+/obj/item/clothing/under/rank/centcom/commander{
+ desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command.";
+ name = "Replica CentCom officer's jumpsuit"
+ },
+/obj/item/clothing/head/hats/centcom_cap{
+ desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
+ name = "Replica CentCom hat"
+ },
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_x = -32
+ },
+/turf/open/floor/carpet/grimy,
+/area/bridge/showroom/corporate)
"bkw" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 31
@@ -21454,31 +21448,6 @@
/obj/machinery/recharge_station,
/turf/open/floor/plating,
/area/crew_quarters/toilet/restrooms)
-"cIb" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/obj/machinery/light/small,
-/obj/effect/turf_decal/bot,
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/crew_quarters/toilet/restrooms)
-"cIc" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/newscaster{
- pixel_x = -32
- },
-/obj/machinery/light/small,
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/bot,
-/obj/structure/toilet{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/crew_quarters/toilet/restrooms)
"cId" = (
/obj/structure/table/reinforced,
/obj/item/book/manual/wiki/security_space_law,
@@ -31356,19 +31325,6 @@
},
/turf/open/floor/prison,
/area/security/prison)
-"ekz" = (
-/obj/item/kirbyplants/random,
-/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral/half/contrasted{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/crew_quarters/toilet/auxiliary)
"ekA" = (
/obj/effect/landmark/blobstart,
/turf/open/floor/iron,
@@ -35772,6 +35728,19 @@
},
/turf/open/floor/iron/dark,
/area/security/courtroom)
+"fDc" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/newscaster{
+ pixel_x = -32
+ },
+/obj/machinery/light/small,
+/obj/effect/landmark/start/assistant,
+/obj/effect/turf_decal/bot,
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/crew_quarters/toilet/restrooms)
"fDi" = (
/obj/effect/turf_decal/tile/red/opposingcorners,
/obj/effect/turf_decal/tile/yellow/opposingcorners{
@@ -42238,16 +42207,6 @@
},
/turf/open/floor/iron,
/area/quartermaster/storage)
-"hye" = (
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/crew_quarters/toilet/restrooms)
"hyj" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -43663,6 +43622,16 @@
/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted,
/turf/open/floor/iron/dark/textured,
/area/maintenance/disposal/incinerator)
+"hTI" = (
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/apc/auto_name/directional/north,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/crew_quarters/toilet/restrooms)
"hTK" = (
/obj/effect/landmark/start/bartender,
/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted,
@@ -44076,6 +44045,22 @@
},
/turf/open/floor/iron/white,
/area/medical/medbay/central)
+"iac" = (
+/obj/structure/table/wood,
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/item/folder/red,
+/obj/item/toy/gun,
+/obj/item/clothing/head/beret/sec{
+ desc = "A replica beret resembling that of a special operations officer under Nanotrasen.";
+ name = "replica officer's beret"
+ },
+/obj/item/radio/intercom{
+ pixel_x = 26
+ },
+/turf/open/floor/carpet/grimy,
+/area/bridge/showroom/corporate)
"iam" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/stripes/white/line{
@@ -47724,23 +47709,6 @@
/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted,
/turf/open/floor/iron/dark,
/area/chapel/office)
-"joe" = (
-/obj/structure/table/wood,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/item/folder/red,
-/obj/item/toy/gun,
-/obj/item/clothing/head/beret/sec{
- armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0,"stamina"=0);
- desc = "A replica beret resembling that of a special operations officer under Nanotrasen.";
- name = "replica officer's beret"
- },
-/obj/item/radio/intercom{
- pixel_x = 26
- },
-/turf/open/floor/carpet/grimy,
-/area/bridge/showroom/corporate)
"jor" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -57910,6 +57878,18 @@
},
/turf/open/floor/iron,
/area/maintenance/port/fore)
+"mFz" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/newscaster{
+ pixel_x = -32
+ },
+/obj/machinery/light/small,
+/obj/effect/turf_decal/bot,
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/crew_quarters/toilet/auxiliary)
"mFB" = (
/obj/machinery/status_display/evac{
pixel_x = 32
@@ -63067,6 +63047,18 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/security/brig)
+"oiJ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/cleanable/vomit/old,
+/obj/machinery/newscaster{
+ pixel_x = -32
+ },
+/obj/machinery/light/small,
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/toilet/auxiliary)
"oiK" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -71610,6 +71602,19 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron,
/area/engine/storage_shared)
+"qWh" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/newscaster{
+ pixel_x = -32
+ },
+/obj/machinery/light/small,
+/obj/effect/landmark/start/assistant,
+/obj/effect/turf_decal/bot,
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/crew_quarters/toilet/auxiliary)
"qWx" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -72818,6 +72823,19 @@
/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted,
/turf/open/floor/iron,
/area/crew_quarters/fitness/recreation)
+"rpy" = (
+/obj/item/kirbyplants/random,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral/half/contrasted{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/crew_quarters/toilet/auxiliary)
"rpG" = (
/obj/machinery/firealarm{
pixel_y = 26
@@ -82784,26 +82802,6 @@
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/hallway/secondary/exit/departure_lounge)
-"uuE" = (
-/obj/structure/table/wood,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/item/folder/blue,
-/obj/item/clothing/under/rank/centcom/commander{
- desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command.";
- name = "Replica CentCom officer's jumpsuit"
- },
-/obj/item/clothing/head/hats/centcom_cap{
- armor = list("melee"=0,"bullet"=0,"laser"=0,"energy"=0,"bomb"=0,"bio"=0,"rad"=0,"stamina"=0);
- desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'";
- name = "Replica CentCom hat"
- },
-/obj/machinery/computer/security/telescreen/entertainment{
- pixel_x = -32
- },
-/turf/open/floor/carpet/grimy,
-/area/bridge/showroom/corporate)
"uuH" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -131955,7 +131953,7 @@ avG
awI
awI
azg
-aAm
+oiJ
auj
rZH
aDL
@@ -132469,7 +132467,7 @@ avI
qZq
xFo
azg
-aAn
+mFz
auj
rZH
aDL
@@ -132980,10 +132978,10 @@ alf
atf
auj
auj
-ekz
+rpy
iuA
azg
-aAo
+qWh
auj
dJr
aDL
@@ -133051,7 +133049,7 @@ czY
wXk
cCU
deI
-uuE
+bku
wlz
fQi
qHr
@@ -135621,7 +135619,7 @@ czY
hgl
qOK
vfF
-joe
+iac
wlz
cIS
qHr
@@ -141271,7 +141269,7 @@ cyL
cxf
csO
cAm
-hye
+hTI
kwW
cFh
cAm
@@ -142046,7 +142044,7 @@ cBP
sEz
cFm
leQ
-cIb
+aMJ
cAm
fmt
jBl
@@ -142560,7 +142558,7 @@ sqY
bKI
cFm
cGK
-cIc
+fDc
cAm
eWS
xyY
diff --git a/_maps/shuttles/emergency/emergency_discoinferno.dmm b/_maps/shuttles/emergency/emergency_discoinferno.dmm
index d6980dcd1f23e..bfc0b1cf9efea 100644
--- a/_maps/shuttles/emergency/emergency_discoinferno.dmm
+++ b/_maps/shuttles/emergency/emergency_discoinferno.dmm
@@ -203,7 +203,6 @@
name = "Disco Inferno"
},
/obj/machinery/door/airlock/gold{
- armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100, "stamina" = 0);
heat_proof = 1;
resistance_flags = 2
},
diff --git a/beestation.dme b/beestation.dme
index c915660cf17f5..0ac7487cd03c2 100644
--- a/beestation.dme
+++ b/beestation.dme
@@ -535,7 +535,6 @@
#include "code\datums\action.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\alarm.dm"
-#include "code\datums\armor.dm"
#include "code\datums\beam.dm"
#include "code\datums\browser.dm"
#include "code\datums\callback.dm"
@@ -624,6 +623,8 @@
#include "code\datums\announcers\default_announcer.dm"
#include "code\datums\announcers\intern_announcer.dm"
#include "code\datums\announcers\medbot_announcer.dm"
+#include "code\datums\armor\_armor.dm"
+#include "code\datums\armor\_atom_armor.dm"
#include "code\datums\atmosphere\_atmosphere.dm"
#include "code\datums\brain_damage\brain_trauma.dm"
#include "code\datums\brain_damage\hypnosis.dm"
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 59f6f8aef3d59..a121e87c9a282 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -24,8 +24,8 @@
#define ACID "acid"
/// Involved in checking if a disease can infect or spread. Also involved in xeno neurotoxin.
#define BIO "bio"
-/// Involves ionizing radiation.
-#define RAD "rad"
+/// Bleed prevention
+#define BLEED "bleed"
/// Involves a shockwave, usually from an explosion.
#define BOMB "bomb"
/// Involves a solid projectile.
@@ -40,14 +40,24 @@
#define LASER "laser"
/// Involves a melee attack or a thrown object.
#define MELEE "melee"
-/// Bleed prevention
-#define BLEED "bleed"
-
+/// Involves ionizing radiation.
+#define RAD "rad"
/*
/// Involved in checking the likelihood of applying a wound to a mob.
#define WOUND "wound"
*/
+#define ARMOR_ALL "all_damage_types"
+
+/// Armor values that are used for damage
+#define ARMOR_LIST_DAMAGE list(BIO, BLEED, BOMB, BULLET, ENERGY, LASER, MELEE, RAD)
+
+/// Armor values that are used for durability
+#define ARMOR_LIST_DURABILITY list(ACID, FIRE)
+
+/// All armors, preferable in the order as seen above
+#define ARMOR_LIST_ALL list(ACID, BIO, BLEED, BOMB, BULLET, CONSUME, ENERGY, FIRE, LASER, MELEE, RAD)
+
//bitflag damage defines used for suicide_act
#define BRUTELOSS (1<<0)
#define FIRELOSS (1<<1)
diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm
index e917f39b6f6c9..37b857bba8133 100644
--- a/code/__DEFINES/vv.dm
+++ b/code/__DEFINES/vv.dm
@@ -100,6 +100,7 @@
#define VV_HK_EDIT_FILTERS "edit_filters"
#define VV_HK_EDIT_COLOR_MATRIX "edit_color_matrix"
#define VV_HK_EDIT_PARTICLES "edit_particles"
+#define VV_HK_ARMOR_MOD "mod_obj_armor"
#define VV_HK_ADD_EMITTER "add_emitter"
#define VV_HK_REMOVE_EMITTER "remove_emitter"
#define VV_HK_ADD_AI "add_ai"
@@ -114,7 +115,6 @@
// /obj
#define VV_HK_OSAY "osay"
#define VV_HK_MASS_DEL_TYPE "mass_delete_type"
-#define VV_HK_ARMOR_MOD "mod_obj_armor"
// /obj/item/card/id
#define VV_ID_PAYDAY "id_payday"
diff --git a/code/datums/armor.dm b/code/datums/armor.dm
deleted file mode 100644
index d78f834717433..0000000000000
--- a/code/datums/armor.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[stamina]-[consume]-[bleed]"
-
-/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, stamina = 0, consume = 0, bleed = 0)
- . = locate(ARMORID)
- if (!.)
- . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, stamina, consume, bleed)
-
-/datum/armor
- datum_flags = DF_USE_TAG
- var/melee
- var/bullet
- var/laser
- var/energy
- var/bomb
- var/bio
- var/rad
- var/fire
- var/acid
- var/stamina
- var/consume
- var/bleed
-
-/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, stamina = 0, consume = 0, bleed = 0)
- src.melee = melee
- src.bullet = bullet
- src.laser = laser
- src.energy = energy
- src.bomb = bomb
- src.bio = bio
- src.rad = rad
- src.fire = fire
- src.acid = acid
- src.stamina = stamina
- src.consume = consume
- src.bleed = bleed
- tag = ARMORID
-
-/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, stamina = 0, consume = 0, bleed = 0)
- return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.stamina+stamina, src.consume+consume, src.bleed+bleed)
-
-/datum/armor/proc/modifyAllRatings(modifier = 0)
- return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, stamina+modifier, consume+modifier, bleed+modifier)
-
-/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, consume, bleed)
- return getArmor((isnull(melee) ? src.melee : melee),\
- (isnull(bullet) ? src.bullet : bullet),\
- (isnull(laser) ? src.laser : laser),\
- (isnull(energy) ? src.energy : energy),\
- (isnull(bomb) ? src.bomb : bomb),\
- (isnull(bio) ? src.bio : bio),\
- (isnull(rad) ? src.rad : rad),\
- (isnull(fire) ? src.fire : fire),\
- (isnull(acid) ? src.acid : acid),\
- (isnull(stamina) ? src.stamina : stamina),\
- (isnull(consume) ? src.consume : consume),\
- (isnull(bleed) ? src.bleed : bleed))
-
-/datum/armor/proc/getRating(rating)
- return vars[rating]
-
-/datum/armor/proc/getList()
- return list(MELEE = melee, BULLET = bullet, LASER = laser, ENERGY = energy, BOMB = bomb, BIO = bio, RAD = rad, FIRE = fire, ACID = acid, STAMINA = stamina, CONSUME = consume, BLEED = bleed)
-
-/datum/armor/proc/attachArmor(datum/armor/AA)
- return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, stamina+AA.stamina, consume+AA.consume, bleed+AA.bleed)
-
-/datum/armor/proc/detachArmor(datum/armor/AA)
- return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, stamina-AA.stamina, consume+AA.consume, bleed+AA.bleed)
-
-/datum/armor/vv_edit_var(var_name, var_value)
- if (var_name == NAMEOF(src, tag))
- return FALSE
- . = ..()
- tag = ARMORID // update tag in case armor values were edited
-
-#undef ARMORID
diff --git a/code/datums/armor/_armor.dm b/code/datums/armor/_armor.dm
new file mode 100644
index 0000000000000..d8ef4ac7250c9
--- /dev/null
+++ b/code/datums/armor/_armor.dm
@@ -0,0 +1,251 @@
+/// Assosciative list of type -> armor. Used to ensure we always hold a reference to default armor datums
+GLOBAL_LIST_INIT(armor_by_type, generate_armor_type_cache())
+
+/proc/generate_armor_type_cache()
+ var/list/armor_cache = list()
+ for(var/datum/armor/armor_type as anything in subtypesof(/datum/armor))
+ armor_type = new armor_type
+ armor_cache[armor_type.type] = armor_type
+ armor_type.GenerateTag()
+ return armor_cache
+
+/**
+ * Gets an armor type datum using the given type by formatting it into the expected datum tag
+ */
+/proc/get_armor_by_type(armor_type)
+ var/armor = locate(replacetext("[armor_type]", "/", "-"))
+ if(armor)
+ return armor
+ if(armor_type == /datum/armor)
+ CRASH("Attempted to get the base armor type, you probably meant to use /datum/armor/none")
+ CRASH("Attempted to get an armor type that did not exist! '[armor_type]'")
+
+/**
+ * The armor datum holds information about different types of armor that an atom can have.
+ * It also contains logic and helpers for calculating damage and effective damage
+ */
+/datum/armor
+
+/**
+ * The armor datum holds information about different types of armor that an atom can have.
+ * It also contains logic and helpers for calculating damage and effective damage
+ */
+/datum/armor
+ VAR_PROTECTED/acid = 0
+ VAR_PROTECTED/bio = 0
+ VAR_PROTECTED/bleed = 0
+ VAR_PROTECTED/bomb = 0
+ VAR_PROTECTED/bullet = 0
+ VAR_PROTECTED/consume = 0
+ VAR_PROTECTED/energy = 0
+ VAR_PROTECTED/fire = 0
+ VAR_PROTECTED/laser = 0
+ VAR_PROTECTED/melee = 0
+ VAR_PROTECTED/rad = 0
+ VAR_PROTECTED/stamina = 0
+ //VAR_PROTECTED/wound = 0
+
+/// A version of armor with no protections
+/datum/armor/none
+
+/// A version of armor that cannot be modified and will always return itself when attempted to be modified
+/datum/armor/immune
+
+/datum/armor/Destroy(force, ...)
+ if(!force && tag)
+ return QDEL_HINT_LETMELIVE
+
+ // something really wants us gone
+ datum_flags &= ~DF_USE_TAG
+ tag = null
+ return ..()
+
+/datum/armor/GenerateTag()
+ ..()
+ tag = replacetext("[type]", "/", "-")
+
+/datum/armor/vv_edit_var(var_name, var_value)
+ return FALSE
+
+/datum/armor/can_vv_mark()
+ return FALSE
+
+/datum/armor/vv_get_dropdown()
+ SHOULD_CALL_PARENT(FALSE)
+ return list("", "MUST MODIFY ARMOR VALUES ON THE PARENT ATOM")
+
+/datum/armor/CanProcCall(procname)
+ return FALSE
+
+/// Generate a brand new armor datum with the modifiers given, if ARMOR_ALL is specified only that modifier is used
+/datum/armor/proc/generate_new_with_modifiers(list/modifiers)
+ var/datum/armor/new_armor = new
+
+ var/all_keys = ARMOR_LIST_ALL
+ if(ARMOR_ALL in modifiers)
+ var/modifier_all = modifiers[ARMOR_ALL]
+ if(!modifier_all)
+ return src
+ for(var/mod in all_keys)
+ new_armor.vars[mod] = vars[mod] + modifier_all
+ return new_armor
+
+ for(var/modifier in modifiers)
+ if(modifier in all_keys)
+ new_armor.vars[modifier] = vars[modifier] + modifiers[modifier]
+ else
+ stack_trace("Attempt to call generate_new_with_modifiers with illegal modifier '[modifier]'! Ignoring it")
+ return new_armor
+
+/datum/armor/immune/generate_new_with_modifiers(list/modifiers)
+ return src
+
+/// Generate a brand new armor datum with the multiplier given, if ARMOR_ALL is specified only that modifer is used
+/datum/armor/proc/generate_new_with_multipliers(list/multipliers)
+ var/datum/armor/new_armor = new
+
+ var/all_keys = ARMOR_LIST_ALL
+ if(ARMOR_ALL in multipliers)
+ var/multiplier_all = multipliers[ARMOR_ALL]
+ if(!multiplier_all)
+ return src
+ for(var/multiplier in all_keys)
+ new_armor.vars[multiplier] = vars[multiplier] * multiplier_all
+ return new_armor
+
+ for(var/multiplier in multipliers)
+ if(multiplier in all_keys)
+ new_armor.vars[multiplier] = vars[multiplier] * multipliers[multiplier]
+ else
+ stack_trace("Attempt to call generate_new_with_multipliers with illegal multiplier '[multiplier]'! Ignoring it")
+ return new_armor
+
+/datum/armor/immune/generate_new_with_multipliers(list/multipliers)
+ return src
+
+/// Generate a brand new armor datum with the values given, if a value is not present it carries over
+/datum/armor/proc/generate_new_with_specific(list/values)
+ var/datum/armor/new_armor = new
+
+ var/all_keys = ARMOR_LIST_ALL
+ if(ARMOR_ALL in values)
+ var/value_all = values[ARMOR_ALL]
+ if(!value_all)
+ return src
+ for(var/mod in all_keys)
+ new_armor.vars[mod] = value_all
+ return new_armor
+
+ for(var/armor_rating in all_keys)
+ if(armor_rating in values)
+ new_armor.vars[armor_rating] = values[armor_rating]
+ else
+ new_armor.vars[armor_rating] = vars[armor_rating]
+ return new_armor
+
+/datum/armor/immune/generate_new_with_specific(list/values)
+ return src
+
+/// Gets the rating of armor for the specified rating
+/datum/armor/proc/get_rating(rating)
+ // its not that I dont trust coders, its just that I don't trust coders
+ if(!(rating in ARMOR_LIST_ALL))
+ CRASH("Attempted to get a rating '[rating]' that doesnt exist")
+ return vars[rating]
+
+/datum/armor/immune/get_rating(rating)
+ return 100
+
+/// Converts all the ratings of the armor into a list, optionally inversed
+/datum/armor/proc/get_rating_list(inverse = FALSE)
+ var/ratings = list()
+ for(var/rating in ARMOR_LIST_ALL)
+ var/value = vars[rating]
+ if(inverse)
+ value *= -1
+ ratings[rating] = value
+ return ratings
+
+/datum/armor/immune/get_rating_list(inverse)
+ var/ratings = ..() // get all ratings
+ for(var/rating in ratings)
+ ratings[rating] = 100 // and set them to 100
+ return ratings
+
+/// Returns a new armor datum with the given armor added onto this one
+/datum/armor/proc/add_other_armor(datum/armor/other)
+ if(ispath(other))
+ other = get_armor_by_type(other)
+ return generate_new_with_modifiers(other.get_rating_list())
+
+/datum/armor/immune/add_other_armor(datum/armor/other)
+ return src
+
+/// Returns a new armor datum with the given armor removed from this one
+/datum/armor/proc/subtract_other_armor(datum/armor/other)
+ if(ispath(other))
+ other = get_armor_by_type(other)
+ return generate_new_with_modifiers(other.get_rating_list(inverse = TRUE))
+
+/datum/armor/immune/subtract_other_armor(datum/armor/other)
+ return src
+
+/// Checks if any of the armor values are non-zero, so this technically also counts negative armor!
+/datum/armor/proc/has_any_armor()
+ for(var/rating as anything in ARMOR_LIST_ALL)
+ if(vars[rating])
+ return TRUE
+ return FALSE
+
+/datum/armor/immune/has_any_armor()
+ return TRUE
+
+/**
+ * Rounds armor_value down to the nearest 10, divides it by 10 and then converts it to Roman numerals.
+ *
+ * Arguments:
+ * * armor_value - Number we're converting
+ */
+/proc/armor_to_protection_class(armor_value)
+ if (armor_value < 0)
+ . = "-"
+ . += "\Roman[round(abs(armor_value), 10) / 10]"
+ return .
+
+/**
+ * Returns the client readable name of an armor type
+ *
+ * Arguments:
+ * * armor_type - The type to convert
+ */
+/proc/armor_to_protection_name(armor_type)
+ switch(armor_type)
+ if(ACID)
+ return "ACID"
+ if(BIO)
+ return "BIOHAZARD"
+ if(BLEED)
+ return "BLEEDING"
+ if(BOMB)
+ return "EXPLOSIVE"
+ if(BULLET)
+ return "BULLET"
+ if(CONSUME)
+ return "CONSUMING"
+ if(ENERGY)
+ return "ENERGY"
+ if(FIRE)
+ return "FIRE"
+ if(LASER)
+ return "LASER"
+ if(MELEE)
+ return "MELEE"
+ if(RAD)
+ return "RAD"
+ if(STAMINA)
+ return "STAMINA"
+ /*
+ if(WOUND)
+ return "WOUNDING"
+ */
+ CRASH("Unknown armor type '[armor_type]'")
diff --git a/code/datums/armor/_atom_armor.dm b/code/datums/armor/_atom_armor.dm
new file mode 100644
index 0000000000000..76a942aabb895
--- /dev/null
+++ b/code/datums/armor/_atom_armor.dm
@@ -0,0 +1,26 @@
+/// Get the atom's armor reference
+/atom/proc/get_armor()
+ RETURN_TYPE(/datum/armor)
+ if(islist(armor))
+ CRASH("var/ARMOR ON ATOM SHOULD NEVER BE SET AS A LIST")
+ return (armor ||= get_armor_by_type(armor_type))
+
+/// Helper to get a specific rating for the atom's armor
+/atom/proc/get_armor_rating(damage_type)
+ var/datum/armor/armor = get_armor()
+ return armor.get_rating(damage_type)
+
+/// Sets the armor of this atom to the specified armor
+/atom/proc/set_armor(datum/armor/armor)
+ if(islist(armor))
+ CRASH("var/ARMOR ON ATOM SHOULD NEVER BE SET AS A LIST")
+ if(src.armor == armor)
+ return
+ if(!(src.armor?.type in GLOB.armor_by_type))
+ qdel(src.armor)
+ src.armor = ispath(armor) ? get_armor_by_type(armor) : armor
+
+/// Helper to update the atom's armor to a new armor with the specified rating
+/atom/proc/set_armor_rating(damage_type, rating)
+ var/datum/armor/armor = get_armor()
+ set_armor(armor.generate_new_with_specific(list("[damage_type]" = rating)))
diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm
index 74a20a7e725a6..72b6f0da4e474 100644
--- a/code/datums/components/armor_plate.dm
+++ b/code/datums/components/armor_plate.dm
@@ -2,10 +2,13 @@
var/amount = 0
var/maxamount = 3
var/upgrade_item = /obj/item/stack/sheet/animalhide/goliath_hide
- var/datum/armor/added_armor = list(MELEE = 10)
+ var/datum/armor/armor_mod = /datum/armor/armor_plate
var/upgrade_name
-/datum/component/armor_plate/Initialize(_maxamount,obj/item/_upgrade_item,datum/armor/_added_armor)
+/datum/armor/armor_plate
+ melee = 10
+
+/datum/component/armor_plate/Initialize(_maxamount, obj/item/_upgrade_item, datum/armor/_added_armor)
if(!isobj(parent))
return COMPONENT_INCOMPATIBLE
@@ -20,14 +23,7 @@
if(_upgrade_item)
upgrade_item = _upgrade_item
if(_added_armor)
- if(islist(_added_armor))
- added_armor = getArmor(arglist(_added_armor))
- else if (istype(_added_armor, /datum/armor))
- added_armor = _added_armor
- else
- stack_trace("Invalid type [_added_armor.type] passed as _armor_item argument to armorplate component")
- else
- added_armor = getArmor(arglist(added_armor))
+ armor_mod = _added_armor
var/obj/item/typecast = upgrade_item
upgrade_name = initial(typecast.name)
@@ -68,7 +64,7 @@
var/obj/O = parent
amount++
- O.armor = O.armor.attachArmor(added_armor)
+ O.set_armor(O.get_armor().add_other_armor(armor_mod))
if(ismecha(O))
var/obj/vehicle/sealed/mecha/R = O
diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm
index 9d809165a1d91..7a833072bcdb5 100644
--- a/code/datums/components/infective.dm
+++ b/code/datums/components/infective.dm
@@ -98,18 +98,18 @@
/datum/component/infective/proc/try_infect_equipped(datum/source, mob/living/L, slot)
SIGNAL_HANDLER
- var/old_permeability
+ var/old_bio_armor
if(isitem(parent))
- //if you are putting an infective item on, it obviously will not protect you, so set its permeability high enough that it will never block ContactContractDisease()
- var/obj/item/I = parent
- old_permeability = I.permeability_coefficient
- I.permeability_coefficient = 1.01
+ //if you are putting an infective item on, it obviously will not protect you, so set its bio armor low enough that it will never block ContactContractDisease()
+ var/obj/item/equipped_item = parent
+ old_bio_armor = equipped_item.get_armor_rating(BIO)
+ equipped_item.set_armor_rating(BIO, 0)
try_infect(L, slot2body_zone(slot))
if(isitem(parent))
- var/obj/item/I = parent
- I.permeability_coefficient = old_permeability
+ var/obj/item/equipped_item = parent
+ equipped_item.set_armor_rating(BIO, old_bio_armor)
/datum/component/infective/proc/try_infect_crossed(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
SIGNAL_HANDLER
diff --git a/code/datums/datum.dm b/code/datums/datum.dm
index ec58f73a8fcca..6bdae6b9ad965 100644
--- a/code/datums/datum.dm
+++ b/code/datums/datum.dm
@@ -273,6 +273,13 @@
SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index))
TIMER_COOLDOWN_END(source, index)
+///Generate a tag for this /datum, if it implements one
+///Should be called as early as possible, best would be in New, to avoid weakref mistargets
+///Really just don't use this, you don't need it, global lists will do just fine MOST of the time
+///We really only use it for mobs to make id'ing people easier
+/datum/proc/GenerateTag()
+ datum_flags |= DF_USE_TAG
+
/// Return text from this proc to provide extra context to hard deletes that happen to it
/// Optional, you should use this for cases where replication is difficult and extra context is required
/// Can be called more then once per object, use harddel_deets_dumped to avoid duplicate calls (I am so sorry)
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index affaee1538536..b3e42e91ad486 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -37,82 +37,68 @@
D.try_infect(src)
-/mob/living/carbon/ContactContractDisease(datum/disease/D, target_zone)
- if(!CanContractDisease(D))
+/mob/living/carbon/ContactContractDisease(datum/disease/disease, target_zone)
+ if(!CanContractDisease(disease))
return FALSE
- var/obj/item/clothing/Cl = null
var/passed = TRUE
- var/head_ch = 80
- var/body_ch = 100
- var/hands_ch = 35
- var/feet_ch = 15
+ var/head_chance = 80
+ var/body_chance = 100
+ var/hands_chance = 35/2
+ var/feet_chance = 15/2
- if(prob(15/D.permeability_mod))
+ if(prob(15/disease.spreading_modifier))
return
if(satiety>0 && prob(satiety/10)) // positive satiety makes it harder to contract the disease.
return
- //Lefts and rights do not matter for arms and legs, they both run the same checks
if(!target_zone)
- target_zone = pick(head_ch;BODY_ZONE_HEAD,body_ch;BODY_ZONE_CHEST,hands_ch;BODY_ZONE_L_ARM,feet_ch;BODY_ZONE_L_LEG)
+ target_zone = pick_weight(list(
+ BODY_ZONE_HEAD = head_chance,
+ BODY_ZONE_CHEST = body_chance,
+ BODY_ZONE_R_ARM = hands_chance,
+ BODY_ZONE_L_ARM = hands_chance,
+ BODY_ZONE_R_LEG = feet_chance,
+ BODY_ZONE_L_LEG = feet_chance,
+ ))
else
target_zone = check_zone(target_zone)
if(ishuman(src))
- var/mob/living/carbon/human/H = src
+ var/mob/living/carbon/human/infecting_human = src
switch(target_zone)
if(BODY_ZONE_HEAD)
- if(isobj(H.head) && !istype(H.head, /obj/item/paper))
- Cl = H.head
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(passed && isobj(H.wear_mask))
- Cl = H.wear_mask
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(passed && isobj(H.wear_neck))
- Cl = H.wear_neck
- passed = prob((Cl.permeability_coefficient*100) - 1)
+ if(isobj(infecting_human.head))
+ passed = prob(100-infecting_human.head.get_armor_rating(BIO))
+ if(passed && isobj(infecting_human.wear_mask))
+ passed = prob(100-infecting_human.wear_mask.get_armor_rating(BIO))
+ if(passed && isobj(infecting_human.wear_neck))
+ passed = prob(100-infecting_human.wear_neck.get_armor_rating(BIO))
if(BODY_ZONE_CHEST)
- if(isobj(H.wear_suit))
- Cl = H.wear_suit
- passed = prob((Cl.permeability_coefficient*100) - 1)
- if(passed && isobj(ITEM_SLOT_ICLOTHING))
- Cl = ITEM_SLOT_ICLOTHING
- passed = prob((Cl.permeability_coefficient*100) - 1)
+ if(isobj(infecting_human.wear_suit))
+ passed = prob(100-infecting_human.wear_suit.get_armor_rating(BIO))
+ if(passed && isobj(infecting_human.w_uniform))
+ passed = prob(100-infecting_human.w_uniform.get_armor_rating(BIO))
if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)
- if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&HANDS)
- Cl = H.wear_suit
- passed = prob((Cl.permeability_coefficient*100) - 1)
-
- if(passed && isobj(H.gloves))
- Cl = H.gloves
- passed = prob((Cl.permeability_coefficient*100) - 1)
+ if(isobj(infecting_human.wear_suit) && infecting_human.wear_suit.body_parts_covered&HANDS)
+ passed = prob(100-infecting_human.wear_suit.get_armor_rating(BIO))
+ if(passed && isobj(infecting_human.gloves))
+ passed = prob(100-infecting_human.gloves.get_armor_rating(BIO))
if(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- if(isobj(H.wear_suit) && H.wear_suit.body_parts_covered&FEET)
- Cl = H.wear_suit
- passed = prob((Cl.permeability_coefficient*100) - 1)
-
- if(passed && isobj(H.shoes))
- Cl = H.shoes
- passed = prob((Cl.permeability_coefficient*100) - 1)
-
- else if(ismonkey(src))
- var/mob/living/carbon/monkey/M = src
- switch(target_zone)
- if(BODY_ZONE_HEAD)
- if(M.wear_mask && isobj(M.wear_mask))
- Cl = M.wear_mask
- passed = prob((Cl.permeability_coefficient*100) - 1)
+ if(isobj(infecting_human.wear_suit) && infecting_human.wear_suit.body_parts_covered&FEET)
+ passed = prob(100-infecting_human.wear_suit.get_armor_rating(BIO))
+ if(passed && isobj(infecting_human.shoes))
+ passed = prob(100-infecting_human.shoes.get_armor_rating(BIO))
if(passed)
- D.try_infect(src)
+ disease.try_infect(src)
-/mob/living/proc/AirborneContractDisease(datum/disease/D, force_spread)
- if( ((D.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*D.permeability_mod) - 1))
- ForceContractDisease(D)
+/mob/living/proc/AirborneContractDisease(datum/disease/disease, force_spread)
+ if(((disease.spread_flags & DISEASE_SPREAD_AIRBORNE) || force_spread) && prob((50*disease.spreading_modifier) - 1))
+ ForceContractDisease(disease)
/mob/living/carbon/AirborneContractDisease(datum/disease/D, force_spread)
if(internal)
@@ -149,4 +135,4 @@
return !is_mouth_covered()
/mob/living/carbon/CanSpreadAirborneDisease()
- return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.get_armor_rating(BIO, src) >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.get_armor_rating(BIO, src) >= 25)))
+ return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.get_armor_rating(BIO) >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.get_armor_rating(BIO) >= 25)))
diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm
index 2058459838839..f14ecfe2b9296 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -25,7 +25,7 @@
var/cure_chance = 8
var/carrier = FALSE //If our host is only a carrier
var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
- var/permeability_mod = 1
+ var/spreading_modifier = 1
var/danger = DISEASE_NONTHREAT
var/list/required_organs = list()
var/needs_all_cures = TRUE
@@ -153,10 +153,31 @@
/datum/disease/proc/Copy()
//note that stage is not copied over - the copy starts over at stage 1
- var/static/list/copy_vars = list("name", "visibility_flags", "disease_flags", "spread_flags", "form", "desc", "agent", "spread_text",
- "cure_text", "max_stages", "stage_prob", "viable_mobtypes", "cures", "infectivity", "cure_chance",
- "bypasses_immunity", "permeability_mod", "danger", "required_organs", "needs_all_cures", "strain_data",
- "infectable_biotypes", "process_dead")
+ var/static/list/copy_vars = list(
+ "name",
+ "visibility_flags",
+ "disease_flags",
+ "spread_flags",
+ "form",
+ "desc",
+ "agent",
+ "spread_text",
+ "cure_text",
+ "max_stages",
+ "stage_prob",
+ "viable_mobtypes",
+ "cures",
+ "infectivity",
+ "cure_chance",
+ "bypasses_immunity",
+ "spreading_modifier",
+ "danger",
+ "required_organs",
+ "needs_all_cures",
+ "strain_data",
+ "infectable_biotypes",
+ "process_dead"
+ )
var/datum/disease/D = copy_type ? new copy_type() : new type()
for(var/V in copy_vars)
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 3903f5cb097c5..2ba44214bd5a2 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -295,7 +295,7 @@
visibility_flags &= ~HIDDEN_SCANNER
SetSpread()
- permeability_mod = max(CEILING(0.4 * transmission, 1), 1)
+ spreading_modifier = max(CEILING(0.4 * transmission, 1), 1)
cure_chance = 15 - clamp(resistance, -5, 5) // can be between 10 and 20
stage_prob = max(stage_rate, 2)
SetDanger(severity)
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 6c0f468f12d5c..0b9320b93890a 100644
--- a/code/datums/diseases/appendicitis.dm
+++ b/code/datums/diseases/appendicitis.dm
@@ -5,7 +5,7 @@
cure_text = "Surgery"
agent = "Shitty Appendix"
viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 1
+ spreading_modifier = 1
desc = "If left untreated the subject will become very weak, and may vomit often."
danger = DISEASE_MEDIUM
disease_flags = CAN_CARRY|CAN_RESIST
diff --git a/code/datums/diseases/cold.dm b/code/datums/diseases/cold.dm
index 0e2254d6d9450..58faea99bc865 100644
--- a/code/datums/diseases/cold.dm
+++ b/code/datums/diseases/cold.dm
@@ -5,7 +5,7 @@
cures = list(/datum/reagent/medicine/spaceacillin)
agent = "XY-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- permeability_mod = 0.5
+ spreading_modifier = 0.5
desc = "If left untreated, the subject will contract the flu."
danger = DISEASE_NONTHREAT
diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm
index 9989f839c5a9b..0ba4a34b7022f 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -7,7 +7,7 @@
cure_chance = 10
agent = "H13N1 flu virion"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
- permeability_mod = 0.75
+ spreading_modifier = 0.75
desc = "If left untreated the subject will feel quite unwell."
danger = DISEASE_MINOR
diff --git a/code/datums/diseases/fluspanish.dm b/code/datums/diseases/fluspanish.dm
index 398f9e88678ef..127d3e45ac655 100644
--- a/code/datums/diseases/fluspanish.dm
+++ b/code/datums/diseases/fluspanish.dm
@@ -7,7 +7,7 @@
cure_chance = 10
agent = "1nqu1s1t10n flu virion"
viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 0.75
+ spreading_modifier = 0.75
desc = "If left untreated the subject will burn to death for being a heretic."
danger = DISEASE_DANGEROUS
diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm
index 742c6e2316bb0..2c8f1aa836e32 100644
--- a/code/datums/diseases/gbs.dm
+++ b/code/datums/diseases/gbs.dm
@@ -9,7 +9,7 @@
agent = "Gravitokinetic Bipotential SADS+"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
- permeability_mod = 1
+ spreading_modifier = 1
danger = DISEASE_BIOHAZARD
/datum/disease/gbs/stage_act()
diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm
index 9084707b0e0d1..8a3e78035c0c4 100644
--- a/code/datums/diseases/heart_failure.dm
+++ b/code/datums/diseases/heart_failure.dm
@@ -6,7 +6,7 @@
cure_text = "Heart replacement surgery to cure. Defibrillation (or as a last resort, uncontrolled electric shocking) may also be effective after the onset of cardiac arrest. Corazone can also mitigate cardiac arrest."
agent = "Shitty Heart"
viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 1
+ spreading_modifier = 1
desc = "If left untreated the subject will die!"
danger = DISEASE_DANGEROUS
disease_flags = CAN_CARRY|CAN_RESIST
diff --git a/code/datums/diseases/magnitis.dm b/code/datums/diseases/magnitis.dm
index 740010762a482..bc5aaa06b2961 100644
--- a/code/datums/diseases/magnitis.dm
+++ b/code/datums/diseases/magnitis.dm
@@ -7,7 +7,7 @@
agent = "Fukkos Miracos"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
- permeability_mod = 0.75
+ spreading_modifier = 0.75
desc = "This disease disrupts the magnetic field of your body, making it act as if a powerful magnet. Injections of iron help stabilize the field."
danger = DISEASE_MEDIUM
infectable_biotypes = list(MOB_ORGANIC, MOB_ROBOTIC)
diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index 855c49a5f53c0..e1a31851cf901 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -7,7 +7,7 @@
cure_chance = 75
agent = "H0NI<42 Virus"
viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 0.75
+ spreading_modifier = 0.75
desc = "If left untreated the subject will probably drive others to insanity."
danger = DISEASE_MEDIUM
diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm
index 589d0903c8cca..648276f61d08c 100644
--- a/code/datums/diseases/retrovirus.dm
+++ b/code/datums/diseases/retrovirus.dm
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
danger = DISEASE_HARMFUL
- permeability_mod = 0.4
+ spreading_modifier = 0.4
stage_prob = 2
var/restcure = 0
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
index 3d73ec600343c..18a4708d5109e 100644
--- a/code/datums/diseases/rhumba_beat.dm
+++ b/code/datums/diseases/rhumba_beat.dm
@@ -7,7 +7,7 @@
cures = list("plasma")
agent = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human)
- permeability_mod = 1
+ spreading_modifier = 1
danger = DISEASE_BIOHAZARD
/datum/disease/rhumba_beat/stage_act()
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index 5b95793ab710c..cc37544606cdf 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/wizarditis.dm
@@ -8,7 +8,7 @@
agent = "Rincewindus Vulgaris"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
- permeability_mod = 0.75
+ spreading_modifier = 0.75
desc = "Some speculate that this virus is the cause of the Space Wizard Federation's existence. Subjects affected show the signs of intellectual disability, yelling obscure sentences or total gibberish. On late stages subjects sometime express the feelings of inner power, and, cite, 'the ability to control the forces of cosmos themselves!' A gulp of strong, manly spirits usually reverts them to normal, humanlike, condition."
danger = DISEASE_HARMFUL
required_organs = list(/obj/item/bodypart/head)
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 4f892ce72991c..d511504d0b9c9 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -215,6 +215,10 @@
item_state = "combatgloves"
worn_icon_state = "combatgloves"
siemens_coefficient = 0
- permeability_coefficient = 0.05
strip_delay = 80
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/krav_maga_combatglovesplus
+
+/datum/armor/krav_maga_combatglovesplus
+ bio = 90
+ fire = 80
+ acid = 50
diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm
index 843a0999e4c27..f5db59fd1a958 100644
--- a/code/datums/materials/_material.dm
+++ b/code/datums/materials/_material.dm
@@ -41,7 +41,7 @@ Simple datum which is instanced once per type and is used for every object of sa
var/texture_layer_icon_state
///a cached icon for the texture filter
var/cached_texture_filter_icon
-
+
/datum/material/New()
. = ..()
@@ -94,16 +94,7 @@ Simple datum which is instanced once per type and is used for every object of sa
o.throwforce *= strength_modifier
/*
- var/list/temp_armor_list = list() //Time to add armor modifiers!
-
- if(!istype(o.armor))
- return
-
- var/list/current_armor = o.armor?.getList()
-
- for(var/i in current_armor)
- temp_armor_list[i] = current_armor[i] * armor_modifiers[i]
- o.armor = getArmor(arglist(temp_armor_list))
+ o.set_armor(o.get_armor().generate_new_with_multipliers(armor_modifiers))
*/
if(!isitem(o))
diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm
index c51f88f08b7f6..852eb92ece7a8 100644
--- a/code/game/atom_defense.dm
+++ b/code/game/atom_defense.dm
@@ -18,14 +18,18 @@
. = damage_amount
+ var/previous_atom_integrity = atom_integrity
+
update_integrity(atom_integrity - damage_amount)
+ var/integrity_failure_amount = integrity_failure * max_integrity
+
//BREAKING FIRST
- if(integrity_failure && atom_integrity <= integrity_failure * max_integrity)
+ if(integrity_failure && previous_atom_integrity > integrity_failure_amount && atom_integrity <= integrity_failure_amount)
atom_break(damage_flag)
//DESTROYING SECOND
- if(atom_integrity <= 0)
+ if(atom_integrity <= 0 && previous_atom_integrity > 0)
atom_destruction(damage_flag)
/// Proc for recovering atom_integrity. Returns the amount repaired by
@@ -63,17 +67,16 @@
CRASH("/atom/proc/run_atom_armor was called on [src] without being implemented as a type that uses integrity!")
if(damage_flag == MELEE && damage_amount < damage_deflection)
return 0
- switch(damage_type)
- if(BRUTE)
- if(BURN)
- else
- return 0
+ if(damage_type != BRUTE && damage_type != BURN)
+ return 0
var/armor_protection = 0
if(damage_flag)
- armor_protection = armor?.getRating(damage_flag)
+ //if(islist(damage_flag))
+ // CRASH("/atom/proc/run_atom_armor returned a damage flag as a list. [damage_flag] returning list [length(damage_flag)]")
+ armor_protection = get_armor_rating(damage_flag)
if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor.
armor_protection = clamp(armor_protection - armour_penetration, min(armor_protection, 0), 100)
- return round(damage_amount * (100 - armor_protection)*0.01, DAMAGE_PRECISION)
+ return round(damage_amount * (100 - armor_protection) * 0.01, DAMAGE_PRECISION)
///the sound played when the atom is damaged.
/atom/proc/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 674d8de01175e..cec93e0299f16 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -125,7 +125,9 @@
///any atom that uses integrity and can be damaged must set this to true, otherwise the integrity procs will throw an error
var/uses_integrity = FALSE
- var/datum/armor/armor
+ VAR_PROTECTED/datum/armor/armor_type = /datum/armor/none
+ VAR_PRIVATE/datum/armor/armor
+
VAR_PRIVATE/atom_integrity //defaults to max_integrity
var/max_integrity = 500
var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the atom breaks. 0.5 being 50%
@@ -245,12 +247,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom)
set_custom_materials(custom_materials)
if(uses_integrity)
- if (islist(armor))
- armor = getArmor(arglist(armor))
- else if (!armor)
- armor = getArmor()
- else if (!istype(armor, /datum/armor))
- stack_trace("Invalid type [armor.type] found in .armor during /atom Initialize()")
atom_integrity = max_integrity
ComponentInitialize()
@@ -1305,6 +1301,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom)
VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters")
VV_DROPDOWN_OPTION(VV_HK_EDIT_COLOR_MATRIX, "Edit Color as Matrix")
VV_DROPDOWN_OPTION(VV_HK_ADD_AI, "Add AI controller")
+ VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify Armor")
if(greyscale_colors)
VV_DROPDOWN_OPTION(VV_HK_MODIFY_GREYSCALE, "Modify greyscale colors")
@@ -1359,6 +1356,30 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom)
if(!isnull(strength))
AddComponent(/datum/component/radioactive, strength, src)
+ if(href_list[VV_HK_ARMOR_MOD])
+ var/list/pickerlist = list()
+ var/list/armorlist = get_armor().get_rating_list()
+
+ for (var/i in armorlist)
+ pickerlist += list(list("value" = armorlist[i], "name" = i))
+
+ var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [src]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist)
+ var/list/armor_all = ARMOR_LIST_ALL
+
+ if (islist(result))
+ if (result["button"] != 2) // If the user pressed the cancel button
+ // text2num conveniently returns a null on invalid values
+ var/list/converted = list()
+ for(var/armor_key in armor_all)
+ converted[armor_key] = text2num(result["values"][armor_key])
+ set_armor(get_armor().generate_new_with_specific(converted))
+ var/message = "[key_name(usr)] modified the armor on [src] ([type]) to: "
+ for(var/armor_key in armor_all)
+ message += "[armor_key]=[get_armor_rating(armor_key)],"
+ message = copytext(message, 1, -1)
+ log_admin("[message]")
+ message_admins("[message]")
+
if(href_list[VV_HK_MODIFY_TRANSFORM] && check_rights(R_VAREDIT))
var/result = input(usr, "Choose the transformation to apply","Transform Mod") as null|anything in list("Scale","Translate","Rotate")
var/matrix/M = transform
@@ -1570,10 +1591,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom)
/atom/proc/analyzer_act(mob/living/user, obj/item/I)
return
-///Generate a tag for this atom
-/atom/proc/GenerateTag()
- return
-
///Connect this atom to a shuttle
/atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
return
diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm
index defcab2e4be36..0c7162fe13824 100644
--- a/code/game/gamemodes/clown_ops/clown_weapons.dm
+++ b/code/game/gamemodes/clown_ops/clown_weapons.dm
@@ -17,28 +17,50 @@
desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity."
clothing_flags = NOSLIP
slowdown = SHOES_SLOWDOWN
- armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 25, BLEED = 40)
+ armor_type = /datum/armor/clown_shoes_combat
strip_delay = 70
resistance_flags = NONE
- permeability_coefficient = 0.05
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
/// Recharging rate in PPS (peels per second)
#define BANANA_SHOES_RECHARGE_RATE 17
#define BANANA_SHOES_MAX_CHARGE 3000
+/datum/armor/clown_shoes_combat
+ melee = 25
+ bullet = 25
+ laser = 25
+ energy = 25
+ bomb = 50
+ bio = 90
+ fire = 70
+ acid = 50
+ stamina = 25
+ bleed = 40
+
//The super annoying version
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat
name = "mk-honk combat shoes"
desc = "The culmination of years of clown combat research, these shoes leave a trail of chaos in their wake. They will slowly recharge themselves over time, or can be manually charged with bananium."
slowdown = SHOES_SLOWDOWN
- armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 25, BLEED = 40)
+ armor_type = /datum/armor/banana_shoes_combat
strip_delay = 70
resistance_flags = NONE
- permeability_coefficient = 0.05
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
always_noslip = TRUE
+/datum/armor/banana_shoes_combat
+ melee = 25
+ bullet = 25
+ laser = 25
+ energy = 25
+ bomb = 50
+ bio = 50
+ fire = 90
+ acid = 50
+ stamina = 25
+ bleed = 40
+
/obj/item/clothing/shoes/clown_shoes/banana_shoes/combat/Initialize(mapload)
. = ..()
var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 78cbdbe27c36d..28c36f3a2a6d9 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -145,9 +145,16 @@ Class Procs:
/// Maximum time an EMP will disable this machine for
var/emp_disable_time = 2 MINUTES
+ armor_type = /datum/armor/obj_machinery
+
+/datum/armor/obj_machinery
+ melee = 25
+ bullet = 10
+ laser = 10
+ fire = 50
+ acid = 70
+
/obj/machinery/Initialize(mapload)
- if(!armor)
- armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0)
. = ..()
GLOB.machines += src
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 5de006e590189..8b05bee19332f 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -6,13 +6,22 @@
layer = PROJECTILE_HIT_THRESHOLD_LAYER
plane = FLOOR_PLANE
max_integrity = 200
- armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_ai_slipper
var/uses = 20
var/cooldown = 0
var/cooldown_time = 100
req_access = list(ACCESS_AI_UPLOAD)
+
+/datum/armor/machinery_ai_slipper
+ melee = 50
+ bullet = 20
+ laser = 20
+ energy = 20
+ fire = 50
+ acid = 30
+
/obj/machinery/ai_slipper/examine(mob/user)
. = ..()
. += "It has [uses] uses of foam remaining."
diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm
index 8496516b8090a..e6770fd442c7d 100644
--- a/code/game/machinery/airlock_cycle_control.dm
+++ b/code/game/machinery/airlock_cycle_control.dm
@@ -53,7 +53,7 @@
req_access = list(ACCESS_ATMOSPHERICS)
max_integrity = 250
integrity_failure = 0.2
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_advanced_airlock_controller
resistance_flags = FIRE_PROOF
layer = ABOVE_WINDOW_LAYER
@@ -77,6 +77,14 @@
var/list/vents = list()
var/obj/vis_target = null
+
+/datum/armor/machinery_advanced_airlock_controller
+ energy = 100
+ bio = 100
+ rad = 100
+ fire = 90
+ acid = 30
+
/obj/machinery/advanced_airlock_controller/lavaland
exterior_pressure = WARNING_LOW_PRESSURE + 10
depressurization_margin = ONE_ATMOSPHERE
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index bdc7e743ba32c..3608ff1f2d458 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -10,11 +10,22 @@
var/device_type = null
var/id = null
var/initialized_button = 0
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_button
use_power = IDLE_POWER_USE
idle_power_usage = 2
resistance_flags = LAVA_PROOF | FIRE_PROOF
+
+/datum/armor/machinery_button
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 10
+ rad = 100
+ fire = 90
+ acid = 70
+
/obj/machinery/button/indestructible
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 52355dfbc4509..67f098cb93210 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -8,8 +8,9 @@
active_power_usage = 10
layer = WALL_OBJ_LAYER
resistance_flags = FIRE_PROOF
+ damage_deflection = 12
- armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_camera
max_integrity = 100
integrity_failure = 0.5
var/default_camera_icon = "camera" //the camera's base icon used by update_icon - icon_state is primarily used for mapping display purposes.
@@ -55,6 +56,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/emp_proof, 0)
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/motion, 0)
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0)
+/datum/armor/machinery_camera
+ melee = 50
+ bullet = 20
+ laser = 20
+ energy = 20
+ fire = 90
+ acid = 50
+
/obj/machinery/camera/preset/toxins //Bomb test site in space
name = "Hardened Bomb-Test Camera"
desc = "A specially-reinforced camera with a long lasting battery, used to monitor the bomb testing site. An external light is attached to the top."
@@ -172,7 +181,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/camera)
if(panel_open)
. += "Its maintenance panel is currently open."
if(!status && powered())
- . += "It can reactivated with a screwdriver."
+ . += "It can reactivated with a wirecutters."
/obj/machinery/camera/vv_edit_var(vname, vval)
// Can't mess with these since they are references
@@ -390,8 +399,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/camera)
return ..()
/obj/machinery/camera/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == MELEE && damage_amount < 12 && !(machine_stat & BROKEN))
- return 0
+ if(machine_stat & BROKEN)
+ return damage_amount
. = ..()
/obj/machinery/camera/atom_break(damage_flag)
diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm
index 9425e4b6368f8..bf3b99bd51987 100644
--- a/code/game/machinery/computer/_computer.dm
+++ b/code/game/machinery/computer/_computer.dm
@@ -12,7 +12,7 @@
active_power_usage = 300
max_integrity = 200
integrity_failure = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 20, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_computer
clicksound = "keyboard"
light_system = STATIC_LIGHT
light_range = 1
@@ -28,6 +28,10 @@
///Should the [icon_state]_broken overlay be shown as an emissive or regular overlay?
var/broken_overlay_emissive = FALSE
+/datum/armor/machinery_computer
+ fire = 40
+ acid = 20
+
/obj/machinery/computer/Initialize(mapload)
. = ..()
QUEUE_SMOOTH(src)
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index b19a591943781..973eb196d23ce 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -304,7 +304,7 @@
anim_parts = "left=-13,0;right=13,0"
normal_integrity = 150
damage_deflection = 5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
/obj/machinery/door/airlock/bronze/seethru
assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru
@@ -582,7 +582,7 @@
desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state."
normal_integrity = 150
damage_deflection = 5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
//////////////////////////////////
/*
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index c2c178a990861..cd77ad5afc593 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -12,7 +12,7 @@
pass_flags_self = PASSDOORS
z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP
max_integrity = 350
- armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_door
CanAtmosPass = ATMOS_PASS_DENSITY
flags_1 = PREVENT_CLICK_UNDER_1
ricochet_chance_mod = 0.8
@@ -42,6 +42,17 @@
var/unres_sides = 0 //Unrestricted sides. A bitflag for which direction (if any) can open the door with no access
var/open_speed = 5
+
+/datum/armor/machinery_door
+ melee = 30
+ bullet = 30
+ laser = 20
+ energy = 20
+ bomb = 10
+ rad = 100
+ fire = 80
+ acid = 70
+
/obj/machinery/door/Initialize(mapload)
. = ..()
set_init_door_layer()
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 0a2f1083bbc60..93e08f2dd9f69 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -24,7 +24,7 @@
layer = BELOW_OPEN_DOOR_LAYER
closingLayer = CLOSED_FIREDOOR_LAYER
assemblytype = /obj/structure/firelock_frame
- armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 95, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/door_firedoor
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN
air_tight = TRUE
open_speed = 2
@@ -37,6 +37,17 @@
var/list/access_log
var/process_ticker //Ratelimit process to one check ~5 process ticks
+
+/datum/armor/door_firedoor
+ melee = 30
+ bullet = 30
+ laser = 20
+ energy = 20
+ bomb = 10
+ rad = 100
+ fire = 95
+ acid = 70
+
/obj/machinery/door/firedoor/Initialize(mapload)
. = ..()
CalculateAffectingAreas()
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index f19e832377097..017dd30e044a2 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -11,7 +11,7 @@
heat_proof = TRUE
safe = FALSE
max_integrity = 600
- armor = list(MELEE = 50, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/door_poddoor
resistance_flags = FIRE_PROOF
damage_deflection = 70
var/datum/crafting_recipe/recipe_type = /datum/crafting_recipe/blast_doors
@@ -21,6 +21,17 @@
var/pod_close_sound = 'sound/machines/blastdoor.ogg'
icon_state = "blast_closed"
+
+/datum/armor/door_poddoor
+ melee = 50
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 50
+ rad = 100
+ fire = 100
+ acid = 70
+
/obj/machinery/door/poddoor/attackby(obj/item/W, mob/user, params)
. = ..()
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index 5ce5a260af7a4..bb3707ec81cc7 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -6,12 +6,24 @@
layer = SHUTTER_LAYER
closingLayer = SHUTTER_LAYER
damage_deflection = 20
+ armor_type = /datum/armor/poddoor_shutters
recipe_type = /datum/crafting_recipe/shutters
base_state = "shut"
icon_state = "shut_closed"
pod_open_sound = 'sound/machines/shutter_open.ogg'
pod_close_sound = 'sound/machines/shutter_close.ogg'
+
+/datum/armor/poddoor_shutters
+ melee = 20
+ bullet = 20
+ laser = 20
+ energy = 75
+ bomb = 25
+ fire = 100
+ acid = 70
+ rad = 75
+
/obj/machinery/door/poddoor/shutters/preopen
icon_state = "shut_open"
density = FALSE
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 044eb5c6069bd..a4fe805c76b50 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -9,7 +9,7 @@
var/base_state = "left"
max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file
integrity_failure = 0
- armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/door_window
visible = FALSE
flags_1 = ON_BORDER_1
opacity = FALSE
@@ -27,6 +27,17 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window)
+
+/datum/armor/door_window
+ melee = 20
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 10
+ rad = 100
+ fire = 70
+ acid = 100
+
/obj/machinery/door/window/Initialize(mapload, set_dir, unres_sides)
. = ..()
if(set_dir)
@@ -439,11 +450,19 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/door/window)
shards = 0
rods = 0
max_integrity = 50
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/window_clockwork
resistance_flags = FIRE_PROOF | ACID_PROOF
operationdelay = 10
var/made_glow = FALSE
+
+/datum/armor/window_clockwork
+ bomb = 10
+ bio = 100
+ rad = 100
+ fire = 70
+ acid = 100
+
/obj/machinery/door/window/clockwork/deconstruct(disassembled)
if(!(flags_1 & NODECONSTRUCT_1) && !disassembled)
drop_amount(/obj/item/clockwork/alloy_shards/medium/gear_bit/large, 2)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 42e3e8d6c421a..20a3df4cec1c2 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -20,7 +20,7 @@
icon_state = "fire0"
max_integrity = 250
integrity_failure = 0.4
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_firealarm
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 6
@@ -42,6 +42,12 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/firealarm)
+
+/datum/armor/machinery_firealarm
+ rad = 100
+ fire = 90
+ acid = 30
+
/obj/machinery/firealarm/Initialize(mapload, dir, building)
. = ..()
if (!req_access)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index e415305e77886..81aba5bbbcf72 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -10,6 +10,7 @@
light_color = LIGHT_COLOR_WHITE
light_power = FLASH_LIGHT_POWER
layer = ABOVE_WINDOW_LAYER
+ damage_deflection = 10
var/obj/item/assembly/flash/handheld/bulb
var/id = null
var/range = 2 //this is roughly the size of brig cell
@@ -103,11 +104,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/flasher)
if(anchored)
flash()
-/obj/machinery/flasher/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == MELEE && damage_amount < 10) //any melee attack below 10 dmg does nothing
- return 0
- . = ..()
-
/obj/machinery/flasher/proc/flash()
if (!powered() || !bulb)
return
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 5e7b854030d93..af8077355d34e 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -42,7 +42,7 @@ Possible to do for anyone motivated enough:
idle_power_usage = 5
active_power_usage = 100
max_integrity = 300
- armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_holopad
circuit = /obj/item/circuitboard/machine/holopad
var/list/masters //List of living mobs that use the holopad
var/list/holorays //Holoray-mob link.
@@ -67,6 +67,14 @@ Possible to do for anyone motivated enough:
///bitfield. used to turn on and off hearing sensitivity depending on if we can act on Hear() at all - meant for lowering the number of unessesary hearable atoms
var/can_hear_flags = NONE
+
+/datum/armor/machinery_holopad
+ melee = 50
+ bullet = 20
+ laser = 20
+ energy = 20
+ fire = 50
+
/obj/machinery/holopad/tutorial
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags_1 = NODECONSTRUCT_1
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index 6d3db9ff5ceb2..529167d2d9736 100644
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -10,11 +10,21 @@
active_power_usage = 4
max_integrity = 300
circuit = /obj/item/circuitboard/machine/igniter
- armor = list(MELEE = 50, BULLET = 30, LASER = 70, ENERGY = 50, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_igniter
resistance_flags = FIRE_PROOF
var/id = null
var/on = FALSE
+
+/datum/armor/machinery_igniter
+ melee = 50
+ bullet = 30
+ laser = 70
+ energy = 50
+ bomb = 20
+ fire = 100
+ acid = 70
+
/obj/machinery/igniter/incinerator_toxmix
id = INCINERATOR_TOXMIX_IGNITER
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 619e0e5502b36..dc80edef57b0c 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -16,6 +16,19 @@
/obj/machinery/mass_driver/notspace
drive_range = 50
+/obj/machinery/mass_driver/supermatter
+ name = "emergency supermatter ejection pad"
+ id = "smeject"
+ armor_type = /datum/armor/massdriver_supermatter
+ critical_machine = 1
+
+/datum/armor/massdriver_supermatter
+ melee = 10
+ bullet = 10
+ laser = 10
+ fire = 100
+ acid = 70
+
/obj/machinery/mass_driver/Initialize(mapload)
. = ..()
wires = new /datum/wires/mass_driver(src)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 3ab494d79723a..0ed542ce53951 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -9,7 +9,7 @@
desc = "A radio beacon used for bot navigation."
layer = UNDER_CATWALK
max_integrity = 500
- armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_navbeacon
var/open = FALSE // true if cover is open
var/locked = TRUE // true if controls are locked
@@ -20,6 +20,15 @@
req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS)
+
+/datum/armor/machinery_navbeacon
+ melee = 70
+ bullet = 70
+ laser = 70
+ energy = 70
+ fire = 80
+ acid = 80
+
/obj/machinery/navbeacon/Initialize(mapload)
. = ..()
diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm
index 1183b83721778..cb5bd0a92777e 100644
--- a/code/game/machinery/newscaster/newscaster_machine.dm
+++ b/code/game/machinery/newscaster/newscaster_machine.dm
@@ -9,7 +9,7 @@
verb_say = "beeps"
verb_ask = "beeps"
verb_exclaim = "beeps"
- armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30)
+ armor_type = /datum/armor/machinery_newscaster
max_integrity = 200
integrity_failure = 0.25
///How much paper is contained within the newscaster?
@@ -61,6 +61,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30)
CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/newscaster)
+
+/datum/armor/machinery_newscaster
+ melee = 50
+ fire = 50
+ acid = 30
+
/obj/machinery/newscaster/Initialize(mapload, ndir, building)
. = ..()
GLOB.allCasters += src
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index d8df4f3c5d524..c616994b0468e 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -39,7 +39,7 @@
//the turret's health
max_integrity = 160
integrity_failure = 0.5
- armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_porta_turret
//if the turret's behaviour control access is locked
var/locked = TRUE
@@ -100,6 +100,16 @@
var/datum/action/turret_toggle/toggle_action
var/mob/remote_controller
+
+/datum/armor/machinery_porta_turret
+ melee = 50
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 30
+ fire = 90
+ acid = 90
+
/obj/machinery/porta_turret/Initialize(mapload)
. = ..()
if(!base)
@@ -762,7 +772,17 @@ DEFINE_BUFFER_HANDLER(/obj/machinery/porta_turret)
lethal_projectile = /obj/projectile/bullet/p50/penetrator/shuttle
lethal_projectile_sound = 'sound/weapons/gunshot_smg.ogg'
stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg'
- armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 80, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/syndicate_shuttle
+
+
+/datum/armor/syndicate_shuttle
+ melee = 50
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 80
+ fire = 90
+ acid = 90
/obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target)
if(target)
diff --git a/code/game/machinery/portable_thermomachine.dm b/code/game/machinery/portable_thermomachine.dm
index 560d4f2191adf..8ee9aa149734d 100644
--- a/code/game/machinery/portable_thermomachine.dm
+++ b/code/game/machinery/portable_thermomachine.dm
@@ -13,7 +13,7 @@
name = "portable thermomachine"
desc = "Made by Space Amish using traditional space techniques, this thermomachine is guaranteed not to set the station on fire. Warranty void if used in engines."
max_integrity = 250
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 10, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_portable_thermomachine
circuit = /obj/item/circuitboard/machine/portable_thermomachine
//We don't use area power, we always use the cell
use_power = NO_POWER_USE
@@ -42,6 +42,12 @@
///Should we add an overlay for open portable thermomachines
var/display_panel = TRUE
+
+/datum/armor/machinery_portable_thermomachine
+ rad = 100
+ fire = 80
+ acid = 10
+
/obj/machinery/portable_thermomachine/get_cell()
return cell
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 1b52cb029d600..82876fad2077b 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -76,11 +76,20 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
var/anon_tips_receiver = FALSE // Can you relay information to this console?
var/auth_id = "Unknown" //Will contain the name and and job of the person who verified it
max_integrity = 300
- armor = list(MELEE = 70, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_requests_console
light_color = LIGHT_COLOR_GREEN
light_power = 1.5
+
+/datum/armor/machinery_requests_console
+ melee = 70
+ bullet = 30
+ laser = 30
+ energy = 30
+ fire = 90
+ acid = 90
+
/obj/machinery/requests_console/update_appearance(updates=ALL)
. = ..()
if(machine_stat & NOPOWER)
diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm
index 1c1a9330a5d21..50986cbe45624 100644
--- a/code/game/machinery/shuttle/shuttle_heater.dm
+++ b/code/game/machinery/shuttle/shuttle_heater.dm
@@ -23,7 +23,7 @@
density = TRUE
z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP
max_integrity = 400
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/shuttle_heater
layer = OBJ_LAYER
showpipe = TRUE
@@ -33,6 +33,14 @@
var/efficiency_multiplier = 1
var/gas_capacity = 0
+
+/datum/armor/shuttle_heater
+ energy = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 30
+
/obj/machinery/atmospherics/components/unary/shuttle/heater/New()
. = ..()
GLOB.custom_shuttle_machines += src
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 8879663f62add..0bad60e62f52a 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -14,10 +14,18 @@
use_power = IDLE_POWER_USE
idle_power_usage = 10
active_power_usage = 100
- armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_blackbox_recorder
var/obj/item/stored
investigate_flags = ADMIN_INVESTIGATE_TARGET
+
+/datum/armor/machinery_blackbox_recorder
+ melee = 25
+ bullet = 10
+ laser = 10
+ fire = 50
+ acid = 70
+
/obj/machinery/blackbox_recorder/Initialize(mapload)
. = ..()
stored = new /obj/item/blackbox(src)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 5ddd053694a58..efe12677ab434 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -117,8 +117,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/body_parts_covered = 0
/// For leaking gas from turf to mask and vice-versa (for masks right now, but at some point, i'd like to include space helmets)
var/gas_transfer_coefficient = 1
- /// For leaking chemicals/diseases from turf to mask and vice-versa
- var/permeability_coefficient = 1
/// For electrical admittance/conductance (electrocution checks and shit)
var/siemens_coefficient = 1
@@ -1257,9 +1255,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
if(3)
take_damage(20, BRUTE, BOMB, 0)
-/obj/item/proc/get_armor_rating(d_type, mob/wearer)
- return armor.getRating(d_type)
-
///Does the current embedding var meet the criteria for being harmless? Namely, does it have a pain multiplier and jostle pain mult of 0? If so, return true.
/obj/item/proc/isEmbedHarmless()
if(embedding)
diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm
index a1015199fb9ea..a332fb9a6ef93 100644
--- a/code/game/objects/items/RCD.dm
+++ b/code/game/objects/items/RCD.dm
@@ -24,7 +24,7 @@ RLD
w_class = WEIGHT_CLASS_LARGE
custom_materials = list(/datum/material/iron=100000)
req_access_txt = "11"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_construction
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/matter = 0
@@ -39,6 +39,11 @@ RLD
var/datum/component/remote_materials/silo_mats //remote connection to the silo
var/silo_link = FALSE //switch to use internal or remote storage
+
+/datum/armor/item_construction
+ fire = 100
+ acid = 50
+
/obj/item/construction/Initialize(mapload)
. = ..()
spark_system = new /datum/effect_system/spark_spread
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index dbb91d6441ab4..8eee31af4c2c7 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list(
w_class = WEIGHT_CLASS_LARGE
slot_flags = ITEM_SLOT_BELT
custom_materials = list(/datum/material/iron=75000, /datum/material/glass=37500)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_pipe_dispenser
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/working = 0
@@ -262,6 +262,11 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list(
/// list of atmos constructs that we don't want to attack with RPD
var/static/list/atmos_constructs = typecacheof(list(/obj/machinery/atmospherics, /obj/structure/transit_tube))
+
+/datum/armor/item_pipe_dispenser
+ fire = 100
+ acid = 50
+
/obj/item/pipe_dispenser/Initialize(mapload)
. = ..()
spark_system = new
diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm
index d1d3f705241e2..14de9f4530b1f 100644
--- a/code/game/objects/items/RSF.dm
+++ b/code/game/objects/items/RSF.dm
@@ -14,7 +14,7 @@ RSF
density = FALSE
anchored = FALSE
item_flags = NOBLUDGEON
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
var/matter = 0
var/mode = 1
w_class = WEIGHT_CLASS_NORMAL
diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm
index 417f8846f0796..8a111a65ce590 100644
--- a/code/game/objects/items/cards_ids.dm
+++ b/code/game/objects/items/cards_ids.dm
@@ -164,7 +164,7 @@
lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi'
slot_flags = ITEM_SLOT_ID
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/card_id
resistance_flags = FIRE_PROOF | ACID_PROOF
var/list/access = list()
var/registered_name// The name registered_name on the card
@@ -176,6 +176,11 @@
/// controls various things, disable to make it have no bank account, ineditable in id machines, etc
var/electric = TRUE // removes account info from examine
+
+/datum/armor/card_id
+ fire = 100
+ acid = 100
+
/obj/item/card/id/Initialize(mapload)
. = ..()
if(mapload && access_txt)
@@ -859,13 +864,17 @@ update_label("John Doe", "Clowny")
name = "paper nametag"
desc = "Some spare papers taped into a vague card shape, with a name scribbled on it. Seems trustworthy."
icon_state = "paper"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/id_paper
resistance_flags = null // removes all resistance because its a piece of paper
access = list()
assignment = "Unknown"
hud_state = JOB_HUD_PAPER
electric = FALSE
+
+/datum/armor/id_paper
+ acid = 50
+
/obj/item/card/id/paper/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/pen))
var/target_name = stripped_input(user, "What name would you like to write onto the card?", "Written name:", registered_name || "John Doe", MAX_MESSAGE_LEN)
diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm
index 28b072da7a69c..b585aebd3a2d8 100644
--- a/code/game/objects/items/crab17.dm
+++ b/code/game/objects/items/crab17.dm
@@ -34,7 +34,7 @@
icon = 'icons/obj/money_machine.dmi'
icon_state = "bogdanoff"
layer = TABLE_LAYER //So that the crate inside doesn't appear underneath
- armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_checkoutmachine
density = TRUE
pixel_z = -8
layer = LARGE_MOB_LAYER
@@ -53,6 +53,16 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/checkoutmachine)
+
+/datum/armor/structure_checkoutmachine
+ melee = 30
+ bullet = 50
+ laser = 50
+ energy = 100
+ bomb = 100
+ fire = 100
+ acid = 80
+
/obj/structure/checkoutmachine/Initialize(mapload, mob/living/user)
bogdanoff = user
add_overlay("flaps")
diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm
index dd8637c868b59..2100e9a95c919 100644
--- a/code/game/objects/items/debug_items.dm
+++ b/code/game/objects/items/debug_items.dm
@@ -200,12 +200,25 @@
desc = "very powerful."
icon_state = "hardsuit0-syndielite"
hardsuit_type = "syndielite"
- armor = list(MELEE = 300, BULLET = 300, LASER = 300, ENERGY = 300, BOMB = 300, BIO = 300, RAD = 300, FIRE = 300, ACID = 300, STAMINA = 300) // prevent armor penetration
+ armor_type = /datum/armor/hardsuit_debug
strip_delay = 6000
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+/datum/armor/hardsuit_debug
+ melee = 300
+ bullet = 300
+ laser = 300
+ energy = 300
+ bomb = 300
+ bio = 300
+ rad = 300
+ fire = 300
+ acid = 300
+ stamina = 300
+
/obj/item/clothing/suit/space/hardsuit/debug
name = "\improper Central Command black hardsuit"
desc = "very powerful."
@@ -213,9 +226,8 @@
hardsuit_type = "syndielite"
w_class = WEIGHT_CLASS_TINY
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/debug
- armor = list(MELEE = 300, BULLET = 300, LASER = 300, ENERGY = 300, BOMB = 300, BIO = 300, RAD = 300, FIRE = 300, ACID = 300, STAMINA = 300) // prevent armor penetration
+ armor_type = /datum/armor/hardsuit_debug
gas_transfer_coefficient = 0
- permeability_coefficient = 0
siemens_coefficient = 0
slowdown = -1
equip_delay_other = 6000 // stripping an admin for 10 minutes
@@ -228,6 +240,7 @@
// debug bag
+
/obj/item/storage/backpack/debug
name = "bag of portable hole"
desc = "A backpack that opens into a localized pocket of nullspace."
@@ -235,7 +248,19 @@
item_state = "holdingpack"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
item_flags = NO_MAT_REDEMPTION
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/backpack_debug
+
+
+/datum/armor/backpack_debug
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
/obj/item/storage/backpack/debug/ComponentInitialize()
. = ..()
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index ad4d2dccb00e1..c957084572fd8 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -14,7 +14,7 @@
throwforce = 6
w_class = WEIGHT_CLASS_BULKY
actions_types = list(/datum/action/item_action/toggle_paddles)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_defibrillator
var/obj/item/shockpaddles/paddle_type = /obj/item/shockpaddles
var/on = FALSE //if the paddles are equipped (1) or on the defib (0)
@@ -26,6 +26,11 @@
var/grab_ghost = TRUE // Do we pull the ghost back into their body?
var/cooldown_duration = 5 SECONDS//how long does it take to recharge
+
+/datum/armor/item_defibrillator
+ fire = 50
+ acid = 50
+
/obj/item/defibrillator/get_cell()
return cell
diff --git a/code/game/objects/items/deployable/barricade.dm b/code/game/objects/items/deployable/barricade.dm
index 9b28f8ebb10b9..c097922a5cacb 100644
--- a/code/game/objects/items/deployable/barricade.dm
+++ b/code/game/objects/items/deployable/barricade.dm
@@ -200,11 +200,21 @@
icon_state = "barrier1"
max_integrity = 180
proj_pass_rate = 20
- armor = list(MELEE = 10, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/barricade_security
req_access = list(ACCESS_SECURITY)
pickup_damaged = FALSE
locked_down = TRUE
+
+/datum/armor/barricade_security
+ melee = 10
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 10
+ rad = 100
+ fire = 10
+
/obj/structure/barricade/security/pick_up_barricade()
var/obj/item/security_barricade/carryable = new(loc)
usr.put_in_hands(carryable)
diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm
index 8f93c94e7dc9f..7706a2763a875 100644
--- a/code/game/objects/items/devices/forcefieldprojector.dm
+++ b/code/game/objects/items/devices/forcefieldprojector.dm
@@ -87,11 +87,21 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE
resistance_flags = INDESTRUCTIBLE
CanAtmosPass = ATMOS_PASS_DENSITY
- armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_projected_forcefield
var/obj/item/forcefield_projector/generator
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/projected_forcefield)
+
+/datum/armor/structure_projected_forcefield
+ bullet = 25
+ laser = 50
+ energy = 50
+ bomb = 25
+ rad = 100
+ fire = 100
+ acid = 100
+
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield_projector/origin)
. = ..()
generator = origin
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index 758e005962151..0fcd562b8a1cb 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -27,7 +27,7 @@
block_sound = 'sound/weapons/egloves.ogg'
block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_dualsaber
resistance_flags = FIRE_PROOF
light_system = MOVABLE_LIGHT
light_range = 6
@@ -37,6 +37,11 @@
var/hacked = FALSE
var/list/possible_colors = list("red", "blue", "green", "purple")
+
+/datum/armor/item_dualsaber
+ fire = 100
+ acid = 70
+
/obj/item/dualsaber/Initialize(mapload)
if(LAZYLEN(possible_colors))
saber_color = pick(possible_colors)
diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm
index 4a5a13943e8de..081497c40a02c 100644
--- a/code/game/objects/items/fireaxe.dm
+++ b/code/game/objects/items/fireaxe.dm
@@ -18,11 +18,16 @@
sharpness = IS_SHARP
bleed_force = BLEED_CUT
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_fireaxe
resistance_flags = FIRE_PROOF
item_flags = ISWEAPON
var/icon_prefix = "fireaxe"
+
+/datum/armor/item_fireaxe
+ fire = 100
+ acid = 30
+
/obj/item/fireaxe/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm
index bb2e99f70d127..a9dd5aa80f46c 100644
--- a/code/game/objects/items/handcuffs.dm
+++ b/code/game/objects/items/handcuffs.dm
@@ -26,10 +26,15 @@
throw_range = 5
custom_materials = list(/datum/material/iron=500)
breakouttime = 1 MINUTES
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/restraints_handcuffs
var/cuffsound = 'sound/weapons/handcuffs.ogg'
var/trashtype = null //for disposable cuffs
+
+/datum/armor/restraints_handcuffs
+ fire = 50
+ acid = 50
+
/obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/user)
if(!istype(C))
return
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 12d6871003764..59fe00b7d5688 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -29,9 +29,14 @@
attack_verb_continuous = list("attacks", "stabs", "pokes")
attack_verb_simple = list("attack", "stab", "poke")
hitsound = 'sound/weapons/bladeslice.ogg'
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/kitchen_fork
var/datum/reagent/forkload //used to eat omelette
+
+/datum/armor/kitchen_fork
+ fire = 50
+ acid = 30
+
/obj/item/kitchen/fork/suicide_act(mob/living/carbon/user)
user.visible_message("[user] stabs \the [src] into [user.p_their()] chest! It looks like [user.p_theyre()] trying to take a bite out of [user.p_them()]self!")
playsound(src, 'sound/items/eatfood.ogg', 50, 1)
diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm
index f06cc501c8dd2..e32c8392d430b 100644
--- a/code/game/objects/items/knives.dm
+++ b/code/game/objects/items/knives.dm
@@ -20,12 +20,17 @@
attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
sharpness = IS_SHARP_ACCURATE
bleed_force = BLEED_CUT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50)
+ armor_type = /datum/armor/item_knife
var/bayonet = FALSE //Can this be attached to a gun?
//wound_bonus = 5
//bare_wound_bonus = 15
tool_behaviour = TOOL_KNIFE
+
+/datum/armor/item_knife
+ fire = 50
+ acid = 50
+
/obj/item/knife/Initialize(mapload)
. = ..()
@@ -186,4 +191,4 @@
custom_materials = list()
attack_verb_continuous = list("shanks", "shivs")
attack_verb_simple = list("shank", "shiv")
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm
index 054c9f0083f01..fba93468ceda5 100644
--- a/code/game/objects/items/melee/energy.dm
+++ b/code/game/objects/items/melee/energy.dm
@@ -3,7 +3,7 @@
hitsound_on = 'sound/weapons/blade1.ogg'
heat = 3500
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/transforming_energy
resistance_flags = FIRE_PROOF
light_system = MOVABLE_LIGHT
light_range = 3
@@ -11,6 +11,11 @@
light_on = FALSE
var/sword_color
+
+/datum/armor/transforming_energy
+ fire = 100
+ acid = 30
+
/obj/item/melee/transforming/energy/Initialize(mapload)
. = ..()
if(active)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 283f276ab0567..b401ff08a3600 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -149,7 +149,12 @@
lefthand_file = null
righthand_file = null
block_power = 60
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100)
+ armor_type = /datum/armor/sabre_mime
+
+
+/datum/armor/sabre_mime
+ fire = 100
+ acid = 100
/obj/item/melee/sabre/mime/on_exit_storage(datum/component/storage/concrete/R)
var/obj/item/storage/belt/sabre/mime/M = R.real_location()
diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm
index 6ed7f359d32d8..a01c3933fd895 100644
--- a/code/game/objects/items/pitchfork.dm
+++ b/code/game/objects/items/pitchfork.dm
@@ -16,9 +16,14 @@
sharpness = IS_SHARP
bleed_force = BLEED_CUT
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_pitchfork
resistance_flags = FIRE_PROOF
+
+/datum/armor/item_pitchfork
+ fire = 100
+ acid = 30
+
/obj/item/pitchfork/ComponentInitialize()
. = ..()
AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=15, block_power_wielded=25, icon_wielded="pitchfork1")
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index 563672328a080..1ed135477a820 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -16,7 +16,7 @@
item_state = "bulldog"
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_pneumatic_cannon
var/maxWeightClass = 20 //The max weight of items that can fit into the cannon
var/loadedWeightClass = 0 //The weight of items currently in the cannon
var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things
@@ -40,6 +40,11 @@
trigger_guard = TRIGGER_GUARD_NORMAL
+
+/datum/armor/item_pneumatic_cannon
+ fire = 60
+ acid = 50
+
/obj/item/pneumatic_cannon/Initialize(mapload)
. = ..()
if(selfcharge)
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index f558447a11618..156c9ae5066f4 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -14,7 +14,7 @@
throw_range = 7
w_class = WEIGHT_CLASS_NORMAL
item_flags = ISWEAPON
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 40, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/melee_powerfist
resistance_flags = FIRE_PROOF
var/click_delay = 1.5
var/fisto_setting = 1
@@ -23,6 +23,11 @@
var/baseforce = 20
+
+/datum/armor/melee_powerfist
+ fire = 100
+ acid = 40
+
/obj/item/melee/powerfist/examine(mob/user)
. = ..()
if(!in_range(user, src))
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index f0f9182affd16..a3d871161d7b5 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -250,7 +250,7 @@
desc = "Metal boots, they look heavy."
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30, BLEED = 60) //does this even do anything on boots?
+ armor_type = /datum/armor/shoes_plate
clothing_flags = NOSLIP
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
@@ -258,6 +258,18 @@
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+
+/datum/armor/shoes_plate
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 40
+ bomb = 60
+ fire = 60
+ acid = 60
+ stamina = 30
+ bleed = 60
+
/obj/item/clothing/shoes/plate/red
icon_state = "crusader-red"
diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm
index ad2ae95a1219a..242a229e7cc62 100644
--- a/code/game/objects/items/singularityhammer.dm
+++ b/code/game/objects/items/singularityhammer.dm
@@ -14,11 +14,20 @@
throw_range = 1
w_class = WEIGHT_CLASS_HUGE
item_flags = ISWEAPON
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_singularityhammer
resistance_flags = FIRE_PROOF | ACID_PROOF
force_string = "LORD SINGULOTH HIMSELF"
var/charged = 5
+
+/datum/armor/item_singularityhammer
+ melee = 50
+ bullet = 50
+ laser = 50
+ bomb = 50
+ fire = 100
+ acid = 100
+
/obj/item/singularityhammer/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm
index 8393847756968..a75d2f6045b13 100644
--- a/code/game/objects/items/spear.dm
+++ b/code/game/objects/items/spear.dm
@@ -21,10 +21,15 @@
sharpness = IS_SHARP
bleed_force = BLEED_CUT
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_spear
var/war_cry = "AAAAARGH!!!"
var/icon_prefix = "spearglass"
+
+/datum/armor/item_spear
+ fire = 50
+ acid = 30
+
/obj/item/spear/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 100, 70) //decent in a pinch, but pretty bad.
diff --git a/code/game/objects/items/stacks/sheets/mineral/glass.dm b/code/game/objects/items/stacks/sheets/mineral/glass.dm
index 3602fc2b74d28..31f1fcac6b563 100644
--- a/code/game/objects/items/stacks/sheets/mineral/glass.dm
+++ b/code/game/objects/items/stacks/sheets/mineral/glass.dm
@@ -17,7 +17,7 @@
icon_state = "sheet-glass"
item_state = "sheet-glass"
mats_per_unit = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_glass
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/glass
grind_results = list(/datum/reagent/silicon = 20)
@@ -28,6 +28,11 @@
cost = 500
source = /datum/robot_energy_storage/glass
+
+/datum/armor/sheet_glass
+ fire = 50
+ acid = 100
+
/obj/item/stack/sheet/glass/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins to slice [user.p_their()] neck with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
return BRUTELOSS
@@ -70,13 +75,18 @@
icon_state = "sheet-rglass"
item_state = "sheet-rglass"
custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_rglass
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/rglass
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10)
point_value = 4
matter_amount = 6
+
+/datum/armor/sheet_rglass
+ fire = 70
+ acid = 100
+
/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
..()
@@ -115,13 +125,18 @@
item_state = "sheet-pglass"
mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT)
material_type = /datum/material/alloy/plasmaglass
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_plasmaglass
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/plasmaglass
grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10)
material_flags = NONE
tableVariant = /obj/structure/table/glass/plasma
+
+/datum/armor/sheet_plasmaglass
+ fire = 75
+ acid = 100
+
/obj/item/stack/sheet/plasmaglass/get_recipes()
return GLOB.pglass_recipes
@@ -152,7 +167,7 @@
icon_state = "sheet-prglass"
item_state = "sheet-prglass"
mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT, /datum/material/iron = MINERAL_MATERIAL_AMOUNT * 0.5)
- armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_plasmarglass
resistance_flags = ACID_PROOF
material_flags = NONE
merge_type = /obj/item/stack/sheet/plasmarglass
@@ -160,6 +175,12 @@
point_value = 23
matter_amount = 8
+
+/datum/armor/sheet_plasmarglass
+ melee = 20
+ fire = 80
+ acid = 100
+
/obj/item/stack/sheet/plasmarglass/get_recipes()
return GLOB.prglass_recipes
@@ -173,10 +194,15 @@
item_state = "sheet-titaniumglass"
mats_per_unit = list(/datum/material/alloy/titaniumglass=MINERAL_MATERIAL_AMOUNT)
material_type = /datum/material/alloy/titaniumglass
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_titaniumglass
resistance_flags = ACID_PROOF
merge_type = /obj/item/stack/sheet/titaniumglass
+
+/datum/armor/sheet_titaniumglass
+ fire = 80
+ acid = 100
+
/obj/item/stack/sheet/titaniumglass/get_recipes()
return GLOB.titaniumglass_recipes
@@ -189,11 +215,16 @@
icon_state = "sheet-plastitaniumglass"
item_state = "sheet-plastitaniumglass"
mats_per_unit = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_plastitaniumglass
resistance_flags = ACID_PROOF
material_flags = NONE
merge_type = /obj/item/stack/sheet/plastitaniumglass
+
+/datum/armor/sheet_plastitaniumglass
+ fire = 80
+ acid = 100
+
/obj/item/stack/sheet/plastitaniumglass/get_recipes()
return GLOB.plastitaniumglass_recipes
@@ -215,7 +246,7 @@
attack_verb_simple = list("stab", "slash", "slice", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
resistance_flags = ACID_PROOF
- armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_shard
max_integrity = 40
sharpness = IS_SHARP
bleed_force = BLEED_SURFACE
@@ -223,6 +254,13 @@
embedding = list("embed_chance" = 65)
+
+/datum/armor/item_shard
+ melee = 100
+ energy = 100
+ fire = 50
+ acid = 100
+
/obj/item/shard/suicide_act(mob/living/user)
user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.")
return BRUTELOSS
diff --git a/code/game/objects/items/stacks/sheets/mineral/metals.dm b/code/game/objects/items/stacks/sheets/mineral/metals.dm
index 288e00ed5f055..51dcb4f176613 100644
--- a/code/game/objects/items/stacks/sheets/mineral/metals.dm
+++ b/code/game/objects/items/stacks/sheets/mineral/metals.dm
@@ -60,7 +60,7 @@ Metals Sheets
material_type = /datum/material/alloy/plasteel
throwforce = 10
flags_1 = CONDUCT_1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_plasteel
resistance_flags = FIRE_PROOF
merge_type = /obj/item/stack/sheet/plasteel
grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20)
@@ -69,6 +69,11 @@ Metals Sheets
matter_amount = 12
material_flags = NONE
+
+/datum/armor/sheet_plasteel
+ fire = 100
+ acid = 80
+
/obj/item/stack/sheet/plasteel/get_recipes()
return GLOB.plasteel_recipes
diff --git a/code/game/objects/items/stacks/sheets/organic/wood.dm b/code/game/objects/items/stacks/sheets/organic/wood.dm
index 9219242ab69fe..35a9daba19827 100644
--- a/code/game/objects/items/stacks/sheets/organic/wood.dm
+++ b/code/game/objects/items/stacks/sheets/organic/wood.dm
@@ -18,13 +18,17 @@ Woods Sheets
icon = 'icons/obj/stacks/organic.dmi'
mats_per_unit = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT)
sheettype = "wood"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_wood
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/wood
material_type = /datum/material/wood
grind_results = list(/datum/reagent/carbon = 20)
walltype = /turf/closed/wall/mineral/wood
+
+/datum/armor/sheet_wood
+ fire = 50
+
/obj/item/stack/sheet/wood/get_recipes()
return GLOB.wood_recipes
@@ -39,11 +43,15 @@ Woods Sheets
icon = 'icons/obj/stacks/organic.dmi'
force = 10
throwforce = 10
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sheet_bamboo
resistance_flags = FLAMMABLE
merge_type = /obj/item/stack/sheet/bamboo
grind_results = list("carbon" = 5)
+
+/datum/armor/sheet_bamboo
+ fire = 50
+
/obj/item/stack/sheet/bamboo/get_recipes()
return GLOB.bamboo_recipes
diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm
index 45a4781f85605..47f0d18d9fd5d 100644
--- a/code/game/objects/items/stacks/tiles/tile_iron.dm
+++ b/code/game/objects/items/stacks/tiles/tile_iron.dm
@@ -10,7 +10,7 @@
throwforce = 10
flags_1 = CONDUCT_1
turf_type = /turf/open/floor/iron
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0)
+ armor_type = /datum/armor/tile_iron
resistance_flags = FIRE_PROOF
matter_amount = 1
cost = 125
@@ -67,6 +67,11 @@
/obj/item/stack/tile/iron/sepia,
)
+
+/datum/armor/tile_iron
+ fire = 100
+ acid = 70
+
/obj/item/stack/tile/iron/attackby(obj/item/W, mob/user, params)
if(W.tool_behaviour == TOOL_WELDER)
if(get_amount() < 4)
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 0749294170a75..c9ffc041309d6 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -45,9 +45,14 @@
item_state = "holdingpack"
resistance_flags = FIRE_PROOF
item_flags = NO_MAT_REDEMPTION
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/backpack_holding
component_type = /datum/component/storage/concrete/bluespace/bag_of_holding
+
+/datum/armor/backpack_holding
+ fire = 60
+ acid = 50
+
/obj/item/storage/backpack/holding/clown
name = "bag of honking"
desc = "An advanced clowning backpack for holding large quantities of pranking gear"
@@ -81,9 +86,21 @@
worn_icon_state = "baguette"
resistance_flags = FIRE_PROOF
item_flags = NO_MAT_REDEMPTION
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/backpack_hammerspace
component_type = /datum/component/storage/concrete/bluespace/bag_of_holding
+
+/datum/armor/backpack_hammerspace
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+
/obj/item/storage/backpack/hammerspace/ComponentInitialize()
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index 475e6b2ff559b..7f8bc5e7787a2 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -222,12 +222,23 @@ It is made out of the same material as the station's Black Box and is designed t
There appears to be a small amount of surface corrosion. It doesn't look like it could withstand much of an explosion. \
It remains quite flush against the wall, and there only seems to be enough room to fit something as slim as an ID card."
can_hack_open = FALSE
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 70, BIO = 100, RAD = 100, FIRE = 80, ACID = 70);
+ armor_type = /datum/armor/safe_caps_spare
max_integrity = 300
color = "#ffdd33"
MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe/caps_spare, 32)
+
+/datum/armor/safe_caps_spare
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 70
+ rad = 100
+ fire = 80
+ acid = 70
+
/obj/item/storage/secure/safe/caps_spare/Initialize(mapload)
. = ..()
var/datum/component/storage/STR = GetComponent(/datum/component/storage)
diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm
index 33fc222943845..b3a7e013fd085 100644
--- a/code/game/objects/items/stunbaton.dm
+++ b/code/game/objects/items/stunbaton.dm
@@ -13,7 +13,7 @@
item_flags = ISWEAPON
attack_verb_continuous = list("enforces the law upon")
attack_verb_simple = list("enforce the law upon")
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/melee_baton
var/stunforce = 40
var/turned_on = FALSE
@@ -22,6 +22,12 @@
var/throw_hit_chance = 35
var/preload_cell_type //if not empty the baton starts with this type of cell
+
+/datum/armor/melee_baton
+ bomb = 50
+ fire = 80
+ acid = 80
+
/obj/item/melee/baton/get_cell()
return cell
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index bffb7ab089494..0827e995e8674 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -19,7 +19,7 @@
throw_range = 4
custom_materials = list(/datum/material/iron = 500)
actions_types = list(/datum/action/item_action/set_internals)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_tank
integrity_failure = 0.5
/// The gases this tank contains.
var/datum/gas_mixture/air_contents = null
@@ -32,6 +32,12 @@
/// Mob that is currently breathing from the tank.
var/mob/living/carbon/breathing_mob = null
+
+/datum/armor/item_tank
+ bomb = 10
+ fire = 80
+ acid = 30
+
/obj/item/tank/dropped(mob/living/user, silent)
. = ..()
// Close open air tank if its current user got sent to the shadowrealm.
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index a527f9f661472..b2e2363db8956 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -12,7 +12,7 @@
slowdown = 1
actions_types = list(/datum/action/item_action/toggle_mister)
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_watertank
resistance_flags = FIRE_PROOF
var/obj/item/noz
@@ -21,6 +21,11 @@
var/list/fill_icon_thresholds = list(1, 20, 30, 40, 50, 60, 70, 80, 90)
var/list/worn_fill_icon_thresholds = list(1, 20, 40, 65, 75, 90)
+
+/datum/armor/item_watertank
+ fire = 100
+ acid = 30
+
/obj/item/watertank/Initialize(mapload)
. = ..()
create_reagents(volume, OPENCONTAINER)
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index 4b0dd92ee6bad..036db26a7aa44 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -110,13 +110,19 @@
throw_speed = 3
throw_range = 5
custom_materials = list(/datum/material/iron=10000)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_hand_tele
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/list/active_portal_pairs
var/max_portal_pairs = 3
var/atmos_link_override
investigate_flags = ADMIN_INVESTIGATE_TARGET
+
+/datum/armor/item_hand_tele
+ bomb = 30
+ fire = 100
+ acid = 100
+
/obj/item/hand_tele/Initialize(mapload)
. = ..()
active_portal_pairs = list()
diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm
index 7caa4d083a85e..19f03f410731e 100644
--- a/code/game/objects/items/tools/crowbar.dm
+++ b/code/game/objects/items/tools/crowbar.dm
@@ -17,10 +17,15 @@
attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack")
tool_behaviour = TOOL_CROWBAR
toolspeed = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_crowbar
drop_sound = 'sound/items/handling/crowbar_drop.ogg'
pickup_sound = 'sound/items/handling/crowbar_pickup.ogg'
+
+/datum/armor/item_crowbar
+ fire = 50
+ acid = 30
+
/obj/item/crowbar/suicide_act(mob/living/user)
user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
diff --git a/code/game/objects/items/tools/powertools.dm b/code/game/objects/items/tools/powertools.dm
index e53106267b310..e9f7a67457d82 100644
--- a/code/game/objects/items/tools/powertools.dm
+++ b/code/game/objects/items/tools/powertools.dm
@@ -6,11 +6,16 @@
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
custom_materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) //done for balance reasons, making them high value for research, but harder to get
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_powertool
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
toolspeed = 0.7
+
+/datum/armor/item_powertool
+ fire = 50
+ acid = 30
+
/obj/item/powertool/attack_self(mob/user)
toggle_mode(user)
diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm
index 59b08705a8ea2..2a4f8911ee9fb 100644
--- a/code/game/objects/items/tools/screwdriver.dm
+++ b/code/game/objects/items/tools/screwdriver.dm
@@ -26,7 +26,7 @@
greyscale_config_inhand_left = /datum/greyscale_config/screwdriver_inhand_left
greyscale_config_inhand_right = /datum/greyscale_config/screwdriver_inhand_right
greyscale_config_belt = /datum/greyscale_config/screwdriver_belt
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_screwdriver
drop_sound = 'sound/items/handling/screwdriver_drop.ogg'
pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg'
/// If the item should be assigned a random color
@@ -42,6 +42,11 @@
"yellow" = "#ffa500"
)
+
+/datum/armor/item_screwdriver
+ fire = 50
+ acid = 30
+
/obj/item/screwdriver/suicide_act(mob/living/user)
user.visible_message("[user] is stabbing [src] into [user.p_their()] [pick("temple", "heart")]! It looks like [user.p_theyre()] trying to commit suicide!")
return BRUTELOSS
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 5f78cff0474f6..8f47e04722a04 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -26,7 +26,7 @@
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_SMALL
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_weldingtool
resistance_flags = FIRE_PROOF
custom_materials = list(/datum/material/iron=70, /datum/material/glass=30)
@@ -45,6 +45,11 @@
tool_behaviour = TOOL_WELDER
toolspeed = 1
+
+/datum/armor/item_weldingtool
+ fire = 100
+ acid = 30
+
/obj/item/weldingtool/Initialize(mapload)
. = ..()
create_reagents(max_fuel)
diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm
index 485c62322bd7a..f4ebb4d146877 100644
--- a/code/game/objects/items/tools/wirecutters.dm
+++ b/code/game/objects/items/tools/wirecutters.dm
@@ -22,7 +22,7 @@
pickup_sound = 'sound/items/handling/wirecutter_pickup.ogg'
tool_behaviour = TOOL_WIRECUTTER
toolspeed = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_wirecutters
var/random_color = TRUE
var/static/list/wirecutter_colors = list(
"blue" = "#1861d5",
@@ -35,6 +35,11 @@
)
+
+/datum/armor/item_wirecutters
+ fire = 50
+ acid = 30
+
/obj/item/wirecutters/Initialize(mapload)
. = ..()
if(random_color) //random colors!
diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm
index 28c09bf616be7..d4c82a0ece171 100644
--- a/code/game/objects/items/tools/wrench.dm
+++ b/code/game/objects/items/tools/wrench.dm
@@ -20,7 +20,12 @@
attack_verb_simple = list("bash", "batter", "bludgeon", "whack")
tool_behaviour = TOOL_WRENCH
toolspeed = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_wrench
+
+
+/datum/armor/item_wrench
+ fire = 50
+ acid = 30
/obj/item/wrench/suicide_act(mob/living/user)
user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm
index a740e0baad725..8062d5e0d079b 100644
--- a/code/game/objects/items/vending_items.dm
+++ b/code/game/objects/items/vending_items.dm
@@ -17,7 +17,7 @@
throw_speed = 1
throw_range = 7
w_class = WEIGHT_CLASS_BULKY
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_vending_refill
// Built automatically from the corresponding vending machine.
// If null, considered to be full. Otherwise, is list(/typepath = amount).
@@ -26,6 +26,11 @@
var/list/contraband
var/list/premium
+
+/datum/armor/item_vending_refill
+ fire = 70
+ acid = 30
+
/obj/item/vending_refill/Initialize(mapload)
. = ..()
name = "\improper [machine_name] restocking unit"
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index dc0ac218de656..51e6a94249423 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -13,9 +13,14 @@
attack_verb_continuous = list("bans")
attack_verb_simple = list("ban")
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_banhammer
resistance_flags = FIRE_PROOF
+
+/datum/armor/item_banhammer
+ fire = 100
+ acid = 70
+
/obj/item/banhammer/suicide_act(mob/living/user)
user.visible_message("[user] is hitting [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to ban [user.p_them()]self from life.")
return (BRUTELOSS|FIRELOSS|TOXLOSS|OXYLOSS)
@@ -87,9 +92,14 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
sharpness = IS_SHARP
bleed_force = BLEED_DEEP_WOUND
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_claymore
resistance_flags = FIRE_PROOF
+
+/datum/armor/item_claymore
+ fire = 100
+ acid = 50
+
/obj/item/claymore/Initialize(mapload)
. = ..()
AddComponent(/datum/component/butchering, 40, 105)
@@ -242,7 +252,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
block_level = 0
block_power = 30
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/claymore_bone
+
+
+/datum/armor/claymore_bone
+ fire = 100
+ acid = 50
/obj/item/katana
name = "katana"
@@ -268,9 +283,14 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
sharpness = IS_SHARP
bleed_force = BLEED_DEEP_WOUND
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_katana
resistance_flags = FIRE_PROOF
+
+/datum/armor/item_katana
+ fire = 100
+ acid = 50
+
/obj/item/katana/cursed
slot_flags = null
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 85177a5e04007..3bf63efddef1e 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -128,9 +128,9 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
/obj/proc/acid_processing()
. = 1
if(!(resistance_flags & ACID_PROOF))
- for(var/armour_value in armor.getList())
+ for(var/armour_value in get_armor_rating())
if(armour_value != ACID && armour_value != FIRE)
- armor = armor.modifyAllRatings(0 - round(sqrt(acid_level)*0.1))
+ set_armor(get_armor().generate_new_with_modifiers(list(0 - round(sqrt(acid_level)*0.1))))
if(prob(33))
playsound(loc, 'sound/items/welder.ogg', 150, 1)
take_damage(min(1 + round(sqrt(acid_level)*0.3), 300), BURN, ACID, 0)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index b76b9ac15ac60..12455b965de64 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -14,7 +14,6 @@ CREATION_TEST_IGNORE_SELF(/obj)
var/bleed_force = 0
/*
- var/datum/armor/armor
VAR_PRIVATE/atom_integrity //defaults to max_integrity
/// The maximum integrity the object can have.
var/max_integrity = 500
@@ -73,13 +72,6 @@ CREATION_TEST_IGNORE_SELF(/obj)
return ..()
/obj/Initialize(mapload)
- //if (islist(armor))
- // armor = getArmor(arglist(armor))
- //else if (!armor)
- // armor = getArmor()
- //else if (!istype(armor, /datum/armor))
- // stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()")
- //atom_integrity = max_integrity
. = ..() //Do this after, else mat datums is mad.
@@ -286,7 +278,6 @@ CREATION_TEST_IGNORE_SELF(/obj)
VV_DROPDOWN_OPTION("", "---")
VV_DROPDOWN_OPTION(VV_HK_MASS_DEL_TYPE, "Delete all of type")
VV_DROPDOWN_OPTION(VV_HK_OSAY, "Object Say")
- VV_DROPDOWN_OPTION(VV_HK_ARMOR_MOD, "Modify armor values")
/obj/vv_do_topic(list/href_list)
if(!(. = ..()))
@@ -294,29 +285,7 @@ CREATION_TEST_IGNORE_SELF(/obj)
if(href_list[VV_HK_OSAY])
if(check_rights(R_FUN, FALSE))
usr.client.object_say(src)
- if(href_list[VV_HK_ARMOR_MOD])
- var/list/pickerlist = list()
- var/list/armorlist = armor.getList()
-
- for (var/i in armorlist)
- pickerlist += list(list("value" = armorlist[i], "name" = i))
-
- var/list/result = presentpicker(usr, "Modify armor", "Modify armor: [src]", Button1="Save", Button2 = "Cancel", Timeout=FALSE, inputtype = "text", values = pickerlist)
-
- if (islist(result))
- if (result["button"] != 2) // If the user pressed the cancel button
- // text2num conveniently returns a null on invalid values
- armor = armor.setRating(melee = text2num(result["values"][MELEE]),\
- bullet = text2num(result["values"][BULLET]),\
- laser = text2num(result["values"][LASER]),\
- energy = text2num(result["values"][ENERGY]),\
- bomb = text2num(result["values"][BOMB]),\
- bio = text2num(result["values"][BIO]),\
- rad = text2num(result["values"][RAD]),\
- fire = text2num(result["values"][FIRE]),\
- acid = text2num(result["values"][ACID]))
- log_admin("[key_name(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]")
- message_admins("[key_name_admin(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], rad: [armor.rad], fire: [armor.fire], acid: [armor.acid]")
+
if(href_list[VV_HK_MASS_DEL_TYPE])
if(check_rights(R_DEBUG|R_SERVER))
var/action_type = alert("Strict type ([type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 18018afc5874c..062bf5ebb91a0 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -1,3 +1,4 @@
+/// Inert structures, such as girders, machine frames, and crates/lockers.
/obj/structure
icon = 'icons/obj/structures.dmi'
pressure_resistance = 8
@@ -8,10 +9,13 @@
ricochet_chance_mod = 0.5
pass_flags_self = PASSSTRUCTURE
var/broken = FALSE
+ armor_type = /datum/armor/obj_structure
+
+/datum/armor/obj_structure
+ fire = 50
+ acid = 50
/obj/structure/Initialize(mapload)
- if (!armor)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
. = ..()
if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))
QUEUE_SMOOTH(src)
diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm
index 6a6da1f919c5e..972109bdd8a80 100644
--- a/code/game/objects/structures/barsigns.dm
+++ b/code/game/objects/structures/barsigns.dm
@@ -6,12 +6,21 @@
req_access = list(ACCESS_BAR)
max_integrity = 500
integrity_failure = 0.5
- armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/sign_barsign
buildable_sign = 0
var/panel_open = FALSE
var/datum/barsign/chosen_sign
+
+/datum/armor/sign_barsign
+ melee = 20
+ bullet = 20
+ laser = 20
+ energy = 100
+ fire = 50
+ acid = 50
+
/obj/structure/sign/barsign/Initialize(mapload)
. = ..()
set_sign(new /datum/barsign/hiddensigns/signoff)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index c8ed5d023e6ec..cd9ed72415e04 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -7,7 +7,7 @@
drag_slowdown = 1.5 // Same as a prone mob
max_integrity = 200
integrity_failure = 0.25
- armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_closet
blocks_emissive = EMISSIVE_BLOCK_GENERIC
pass_flags_self = LETPASSCLICKS | PASSSTRUCTURE
interaction_flags_atom = NONE
@@ -60,6 +60,15 @@
//should be just for crates, right?
var/obj/item/paper/fluff/jobs/cargo/manifest/manifest
+
+/datum/armor/structure_closet
+ melee = 20
+ bullet = 10
+ laser = 10
+ bomb = 10
+ fire = 70
+ acid = 60
+
/obj/structure/closet/Initialize(mapload)
. = ..()
// if closed, any item at the crate's loc is put in the contents
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index a52f0d6c0dee3..8d98a2936532a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -4,9 +4,18 @@
locked = TRUE
icon_state = "secure"
max_integrity = 250
- armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/closet_secure_closet
secure = TRUE
+
+/datum/armor/closet_secure_closet
+ melee = 30
+ bullet = 50
+ laser = 50
+ energy = 100
+ fire = 80
+ acid = 80
+
/obj/structure/closet/secure_closet/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
if(damage_flag == MELEE && damage_amount < 20)
return 0
diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm
index 45fb0291f6174..e76645be45687 100644
--- a/code/game/objects/structures/crates_lockers/crates/secure.dm
+++ b/code/game/objects/structures/crates_lockers/crates/secure.dm
@@ -5,14 +5,19 @@
secure = TRUE
locked = TRUE
max_integrity = 500
- armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/crate_secure
var/tamperproof = 0
icon_door = "crate"
+ damage_deflection = 25
-/obj/structure/closet/crate/secure/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == MELEE && damage_amount < 25)
- return 0
- . = ..()
+
+/datum/armor/crate_secure
+ melee = 30
+ bullet = 50
+ laser = 50
+ energy = 100
+ fire = 80
+ acid = 80
/obj/structure/closet/crate/secure/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0)
if(prob(tamperproof) && damage_amount >= DAMAGE_PRECISION)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 2f2dcb4932e7a..59c5cbe815f9a 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -6,7 +6,7 @@
density = TRUE
anchored = TRUE
resistance_flags = ACID_PROOF
- armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_displaycase
max_integrity = 200
integrity_failure = 0.25
var/obj/item/showpiece = null
@@ -31,6 +31,13 @@
///Represents a signal source of screaming when broken
var/datum/alarm_handler/alarm_manager
+
+/datum/armor/structure_displaycase
+ melee = 30
+ bomb = 10
+ fire = 70
+ acid = 100
+
/obj/structure/displaycase/Initialize(mapload)
. = ..()
if(start_showpieces.len && !start_showpiece_type)
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index 0f9bd1ad18a70..0aca0e9a67846 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -5,7 +5,7 @@
icon_state = "fireaxe"
anchored = TRUE
density = FALSE
- armor = list(MELEE = 50, BULLET = 20, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_fireaxecabinet
max_integrity = 150
integrity_failure = 0.33
layer = ABOVE_WINDOW_LAYER
@@ -15,6 +15,16 @@
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32)
+
+/datum/armor/structure_fireaxecabinet
+ melee = 50
+ bullet = 20
+ energy = 100
+ bomb = 10
+ rad = 100
+ fire = 90
+ acid = 50
+
/obj/structure/fireaxecabinet/Initialize(mapload)
. = ..()
fireaxe = new
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index fe5d05fc53efa..8f1cfd01f8496 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -14,7 +14,7 @@
z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP
pressure_resistance = 5*ONE_ATMOSPHERE
layer = BELOW_OBJ_LAYER
- armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_grille
max_integrity = 50
integrity_failure = 0.4
var/rods_type = /obj/item/stack/rods
@@ -25,7 +25,16 @@
pipe_astar_cost = 1\
)
-/obj/structure/grille/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0)
+
+/datum/armor/structure_grille
+ melee = 50
+ bullet = 70
+ laser = 70
+ energy = 100
+ bomb = 10
+ rad = 100
+
+/obj/structure/grille/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration)
. = ..()
update_appearance()
diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm
index e4704b0e9e266..b2436f7cce4a5 100644
--- a/code/game/objects/structures/holosign.dm
+++ b/code/game/objects/structures/holosign.dm
@@ -6,10 +6,18 @@
icon = 'icons/effects/effects.dmi'
anchored = TRUE
max_integrity = 1
- armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 20, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_holosign
layer = BELOW_OBJ_LAYER
var/obj/item/holosign_creator/projector
+
+/datum/armor/structure_holosign
+ bullet = 50
+ laser = 50
+ energy = 50
+ fire = 20
+ acid = 20
+
/obj/structure/holosign/emp_act(severity)
take_damage(max_integrity/severity, BRUTE, MELEE, 1)
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 8efc68e382e4f..6d7599b0438ec 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -9,7 +9,7 @@
canSmoothWith = list(SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LATTICE)
density = FALSE
anchored = TRUE
- armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_lattice
max_integrity = 50
layer = LATTICE_LAYER //under pipes
plane = FLOOR_PLANE
@@ -17,6 +17,12 @@
// flags = CONDUCT_1
z_flags = Z_BLOCK_OUT_DOWN
+
+/datum/armor/structure_lattice
+ melee = 50
+ fire = 80
+ acid = 50
+
/obj/structure/lattice/examine(mob/user)
. = ..()
. += deconstruction_hints(user)
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index e47a0f3c8afb4..08fe551abc1c3 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -11,7 +11,7 @@
icon = 'icons/obj/doors/mineral_doors.dmi'
icon_state = "metal"
max_integrity = 200
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_mineral_door
CanAtmosPass = ATMOS_PASS_DENSITY
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
rad_insulation = RAD_MEDIUM_INSULATION
@@ -26,6 +26,15 @@
var/sheetType = /obj/item/stack/sheet/iron //what we're made of
var/sheetAmount = 7 //how much we drop when deconstructed
+
+/datum/armor/structure_mineral_door
+ melee = 10
+ energy = 100
+ bomb = 10
+ rad = 100
+ fire = 50
+ acid = 50
+
/obj/structure/mineral_door/Initialize(mapload)
. = ..()
air_update_turf(TRUE)
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index ac850ce157a0d..bd49f1647ed9f 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -3,12 +3,23 @@
desc = "Heavy duty, airtight, plastic flaps. Definitely can't get past those. No way."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "plasticflaps"
- armor = list(MELEE = 100, BULLET = 80, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_plasticflaps
density = FALSE
anchored = TRUE
layer = BELOW_OBJ_LAYER
CanAtmosPass = ATMOS_PASS_NO
+
+/datum/armor/structure_plasticflaps
+ melee = 100
+ bullet = 80
+ laser = 80
+ energy = 100
+ bomb = 50
+ rad = 100
+ fire = 50
+ acid = 50
+
/obj/structure/plasticflaps/opaque
opacity = TRUE
diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm
index ca961d47a5197..0b1446d241e97 100644
--- a/code/game/objects/structures/railings.dm
+++ b/code/game/objects/structures/railings.dm
@@ -7,12 +7,23 @@
density = TRUE
anchored = TRUE
pass_flags_self = LETPASSTHROW|PASSSTRUCTURE
+ /// armor more or less consistent with grille. max_integrity about one time and a half that of a grille.
+ armor_type = /datum/armor/structure_railing
max_integrity = 75
var/climbable = TRUE
///Initial direction of the railing.
var/ini_dir
+
+/datum/armor/structure_railing
+ melee = 50
+ bullet = 70
+ laser = 70
+ energy = 100
+ bomb = 10
+ rad = 100
+
/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch
icon_state = "railing_corner"
density = FALSE
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index f19ed74a5b570..a32379b2d7493 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -5,10 +5,16 @@
density = FALSE
layer = SIGN_LAYER
max_integrity = 100
- armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_sign
var/buildable_sign = 1 //unwrenchable and modifiable
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
+
+/datum/armor/structure_sign
+ melee = 50
+ fire = 50
+ acid = 50
+
/obj/structure/sign/basic
name = "blank sign"
desc = "How can signs be real if our eyes aren't real?"
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 1a657d3bc2c98..543711fc2bd40 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -289,9 +289,14 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/table)
canSmoothWith = null
max_integrity = 70
resistance_flags = ACID_PROOF
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/table_glass
var/list/debris = list()
+
+/datum/armor/table_glass
+ fire = 80
+ acid = 100
+
/obj/structure/table/glass/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
@@ -357,7 +362,15 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/table)
buildstack = /obj/item/stack/sheet/plasmaglass
glass_shard_type = /obj/item/shard/plasma
max_integrity = 270
- armor = list(MELEE = 10, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 100)
+ armor_type = /datum/armor/glass_plasma
+
+
+/datum/armor/glass_plasma
+ melee = 10
+ bullet = 5
+ bomb = 10
+ fire = 80
+ acid = 100
/obj/structure/table/glass/plasma/Initialize(mapload)
. = ..()
@@ -478,7 +491,17 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/table)
buildstack = /obj/item/stack/sheet/plasteel
max_integrity = 200
integrity_failure = 0.25
- armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/table_reinforced
+
+
+/datum/armor/table_reinforced
+ melee = 10
+ bullet = 30
+ laser = 30
+ energy = 100
+ bomb = 20
+ fire = 80
+ acid = 70
/obj/structure/table/reinforced/deconstruction_hints(mob/user)
if(deconstruction_ready)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 55de8fdee8216..3d43d0e1027bc 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -10,7 +10,7 @@
max_integrity = 50
can_be_unanchored = TRUE
resistance_flags = ACID_PROOF
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_window
CanAtmosPass = ATMOS_PASS_PROC
rad_insulation = RAD_VERY_LIGHT_INSULATION
rad_flags = RAD_PROTECT_CONTENTS
@@ -33,6 +33,11 @@
ricochet_chance_mod = 0.4
+
+/datum/armor/structure_window
+ fire = 80
+ acid = 100
+
/obj/structure/window/examine(mob/user)
. = ..()
if(reinf)
@@ -401,13 +406,21 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
icon_state = "rwindow"
reinf = TRUE
heat_resistance = 1600
- armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/window_reinforced
max_integrity = 100
explosion_block = 1
glass_type = /obj/item/stack/sheet/rglass
rad_insulation = RAD_HEAVY_INSULATION
ricochet_chance_mod = 0.8
+
+/datum/armor/window_reinforced
+ melee = 50
+ bomb = 25
+ rad = 100
+ fire = 80
+ acid = 100
+
/obj/structure/window/reinforced/spawner/east
dir = EAST
@@ -426,11 +439,20 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
icon_state = "plasmawindow"
reinf = FALSE
heat_resistance = 25000
- armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, RAD = 100, FIRE = 99, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/window_plasma
max_integrity = 300
glass_type = /obj/item/stack/sheet/plasmaglass
rad_insulation = RAD_NO_INSULATION
+
+/datum/armor/window_plasma
+ melee = 75
+ bullet = 5
+ bomb = 45
+ rad = 100
+ fire = 99
+ acid = 100
+
/obj/structure/window/plasma/spawnDebris(location)
. = list()
. += new /obj/item/shard/plasma(location)
@@ -458,11 +480,20 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
icon_state = "plasmarwindow"
reinf = TRUE
heat_resistance = 50000
- armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 99, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/plasma_reinforced
max_integrity = 500
explosion_block = 2
glass_type = /obj/item/stack/sheet/plasmarglass
+
+/datum/armor/plasma_reinforced
+ melee = 85
+ bullet = 20
+ bomb = 60
+ rad = 100
+ fire = 99
+ acid = 100
+
/obj/structure/window/plasma/reinforced/spawner/east
dir = EAST
@@ -489,12 +520,21 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
icon_state = "duwindow"
reinf = TRUE
heat_resistance = 50000
- armor = list(MELEE = 45, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/window_depleteduranium
max_integrity = 500
explosion_block = 2
glass_type = /obj/item/stack/sheet/mineral/uranium
rad_insulation = RAD_FULL_INSULATION
+
+/datum/armor/window_depleteduranium
+ melee = 45
+ bullet = 20
+ bomb = 60
+ rad = 100
+ fire = 100
+ acid = 100
+
/obj/structure/window/depleteduranium/spawner/east
dir = EAST
@@ -621,12 +661,20 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
flags_1 = PREVENT_CLICK_UNDER_1
reinf = TRUE
heat_resistance = 1600
- armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/window_shuttle
explosion_block = 3
glass_type = /obj/item/stack/sheet/titaniumglass
glass_amount = 2
ricochet_chance_mod = 0.9
+
+/datum/armor/window_shuttle
+ melee = 50
+ bomb = 50
+ rad = 100
+ fire = 80
+ acid = 100
+
/obj/structure/window/shuttle/narsie_act()
add_atom_colour("#3C3434", FIXED_COLOUR_PRIORITY)
@@ -651,11 +699,19 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
flags_1 = PREVENT_CLICK_UNDER_1
reinf = TRUE
heat_resistance = 1600
- armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/window_plastitanium
explosion_block = 3
glass_type = /obj/item/stack/sheet/plastitaniumglass
glass_amount = 2
+
+/datum/armor/window_plastitanium
+ melee = 50
+ bomb = 50
+ rad = 100
+ fire = 80
+ acid = 100
+
/obj/structure/window/plastitanium/unanchored
anchored = FALSE
@@ -678,7 +734,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/window)
decon_speed = 10
CanAtmosPass = ATMOS_PASS_YES
resistance_flags = FLAMMABLE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
breaksound = 'sound/items/poster_ripped.ogg'
hitsound = 'sound/weapons/slashmiss.ogg'
var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/windows/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1)
diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm
index 3e75c43a45649..aa8cc3ce7b5bc 100644
--- a/code/game/shuttle_engines.dm
+++ b/code/game/shuttle_engines.dm
@@ -8,7 +8,15 @@
icon = 'icons/turf/shuttle.dmi'
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
max_integrity = 500
- armor = list(MELEE = 100, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) //default + ignores melee
+ armor_type = /datum/armor/structure_shuttle
+
+
+/datum/armor/structure_shuttle
+ melee = 100
+ bullet = 10
+ laser = 10
+ fire = 50
+ acid = 70
/obj/structure/shuttle/engine
name = "engine"
diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm
index 104b7d6dadd28..a07d954005053 100644
--- a/code/game/turfs/open/lava.dm
+++ b/code/game/turfs/open/lava.dm
@@ -115,8 +115,8 @@
O.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava
if(O.resistance_flags & FIRE_PROOF)
O.resistance_flags &= ~FIRE_PROOF
- if(O.armor.fire > 50) //obj with 100% fire armor still get slowly burned away.
- O.armor = O.armor.setRating(fire = 50)
+ if(O.get_armor_rating(FIRE) > 50) //obj with 100% fire armor still get slowly burned away.
+ O.set_armor_rating(FIRE, 50)
O.fire_act(10000, 1000 * delta_time)
if(istype(O, /obj/structure/closet))
var/obj/structure/closet/C = O
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index a1992909487a4..6a375c26b2091 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -160,11 +160,6 @@ CREATION_TEST_IGNORE_SELF(/turf)
if(uses_integrity)
atom_integrity = max_integrity
- if (islist(armor))
- armor = getArmor(arglist(armor))
- else if (!armor)
- armor = getArmor()
-
if(isopenturf(src))
var/turf/open/O = src
__auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf()) && !O.planetary_atmos)
@@ -301,6 +296,7 @@ CREATION_TEST_IGNORE_SELF(/turf)
// Here's hoping it doesn't stay like this for years before we finish conversion to step_
var/atom/firstbump
var/canPassSelf = CanPass(mover, get_dir(src, mover))
+
if(canPassSelf || (mover.movement_type & PHASING))
for(var/atom/movable/thing as anything in contents)
if(QDELETED(mover))
diff --git a/code/game/turfs/turf_integrity.dm b/code/game/turfs/turf_integrity.dm
index dc685c2952001..f418f00819a09 100644
--- a/code/game/turfs/turf_integrity.dm
+++ b/code/game/turfs/turf_integrity.dm
@@ -45,14 +45,7 @@
/turf/proc/generate_armor()
armor_generated = TRUE
var/armour_val = get_armour_list()
- if (islist(armour_val))
- armor = getArmor(arglist(armour_val))
- else if (!armour_val)
- return
- else if (!istype(armour_val, /datum/armor))
- stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()")
- else
- armor = armour_val
+ armor = armour_val
/turf/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0)
if(QDELETED(src))
@@ -87,7 +80,7 @@
if(damage_flag)
if (!armor_generated)
generate_armor()
- armor_protection = armor?.getRating(damage_flag)
+ armor_protection = get_armor_rating(damage_flag)
if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor.
armor_protection = clamp(armor_protection - armour_penetration, min(armor_protection, 0), 100)
return round(damage_amount * (100 - armor_protection)*0.01, DAMAGE_PRECISION)
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 0f9d922dbd29e..5b9878a9c0999 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -13,7 +13,7 @@
icon_state = "vest_stealth"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70, STAMINA = 30, BLEED = 40)
+ armor_type = /datum/armor/abductor_vest
actions_types = list(/datum/action/item_action/hands_free/activate)
allowed = list(
/obj/item/abductor,
@@ -29,13 +29,32 @@
/// Cooldown in seconds
var/combat_cooldown = 20
var/datum/icon_snapshot/disguise
- var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70, STAMINA = 30, BLEED = 40)
- var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 90, ACID = 90, STAMINA = 60, BLEED = 80)
-/obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload)
- . = ..()
- stealth_armor = getArmor(arglist(stealth_armor))
- combat_armor = getArmor(arglist(combat_armor))
+/datum/armor/abductor_combat
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 50
+ rad = 15
+ bio = 50
+ fire = 90
+ acid = 90
+ stamina = 30
+ bleed = 40
+
+/datum/armor/abductor_vest
+ melee = 15
+ bullet = 15
+ laser = 15
+ energy = 25
+ bomb = 15
+ rad = 50
+ bio = 15
+ fire = 70
+ acid = 70
+ stamina = 60
+ bleed = 80
/obj/item/clothing/suit/armor/abductor/vest/proc/toggle_nodrop()
if(HAS_TRAIT_FROM(src, TRAIT_NODROP, ABDUCTOR_VEST_TRAIT))
@@ -50,11 +69,11 @@
if(VEST_STEALTH)
mode = VEST_COMBAT
DeactivateStealth()
- armor = combat_armor
+ set_armor(/datum/armor/abductor_combat)
icon_state = "vest_combat"
if(VEST_COMBAT)// TO STEALTH
mode = VEST_STEALTH
- armor = stealth_armor
+ set_armor(/datum/armor/abductor_vest)
icon_state = "vest_stealth"
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
@@ -886,9 +905,13 @@ Congratulations! You are now trained for invasive xenobiology research!"}
icon_state = "abductor-suit"
item_state = "bl_suit"
worn_icon = 'icons/mob/clothing/under/syndicate.dmi'
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/under_abductor
can_adjust = FALSE
+/datum/armor/under_abductor
+ bomb = 10
+ bio = 10
+
#undef VEST_STEALTH
#undef VEST_COMBAT
#undef GIZMO_SCAN
diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm
index 4364156a88617..1162beb69cdc9 100644
--- a/code/modules/antagonists/blob/blob_mobs.dm
+++ b/code/modules/antagonists/blob/blob_mobs.dm
@@ -149,8 +149,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/simple_animal/hostile/blob/blobspore)
/mob/living/simple_animal/hostile/blob/blobspore/proc/Zombify(mob/living/carbon/human/H)
is_zombie = 1
if(H.wear_suit)
- var/obj/item/clothing/suit/armor/A = H.wear_suit
- maxHealth += A.armor.melee //That zombie's got armor, I want armor!
+ maxHealth += H.get_armor_rating(MELEE)
maxHealth += 40
health = maxHealth
name = "blob zombie"
diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm
index db27a51f40716..8b20d97aea5a4 100644
--- a/code/modules/antagonists/blob/blobstrains/_reagent.dm
+++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm
@@ -7,13 +7,13 @@
/datum/blobstrain/reagent/attack_living(var/mob/living/L)
- var/mob_protection = L.get_permeability_protection()
- reagent.reaction_mob(L, VAPOR, 25, 1, mob_protection, overmind)
+ var/mob_protection = L.getarmor(null, BIO) * 0.01
+ reagent.reaction_mob(L, VAPOR, 25, TRUE, mob_protection, overmind)
send_message(L)
/datum/blobstrain/reagent/blobbernaut_attack(mob/living/L)
- var/mob_protection = L.get_permeability_protection()
- reagent.reaction_mob(L, VAPOR, 20, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage.
+ var/mob_protection = L.getarmor(null, BIO) * 0.01
+ reagent.reaction_mob(L, VAPOR, 20, FALSE, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage.
/datum/blobstrain/reagent/on_sporedeath(mob/living/spore)
spore.reagents.add_reagent(reagent.type, 10)
diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
index b4b95e46dfd26..7e197817c751a 100644
--- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
+++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm
@@ -33,7 +33,7 @@
for(var/mob/living/L in ohearers(1, get_turf(M)))
if(FACTION_BLOB in L.faction) //no friendly fire
continue
- var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O)
+ var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.getarmor(null, BIO) * 0.01, O)
L.apply_damage(0.4*aoe_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, BRUTE)
diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm
index 8836bba8305f8..4a38aab734d03 100644
--- a/code/modules/antagonists/blob/structures/_blob.dm
+++ b/code/modules/antagonists/blob/structures/_blob.dm
@@ -12,7 +12,7 @@
CanAtmosPass = ATMOS_PASS_PROC
var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
max_integrity = 30
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_blob
var/health_regen = 2 //how much health this blob regens when pulsed
var/pulse_timestamp = 0 //we got pulsed when?
var/heal_timestamp = 0 //we got healed when?
@@ -23,6 +23,11 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob)
+
+/datum/armor/structure_blob
+ fire = 80
+ acid = 70
+
/obj/structure/blob/Initialize(mapload, owner_overmind)
. = ..()
if(owner_overmind)
@@ -280,7 +285,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob)
return 0
var/armor_protection = 0
if(damage_flag)
- armor_protection = armor.getRating(damage_flag)
+ armor_protection = get_armor_rating(damage_flag)
damage_amount = round(damage_amount * (100 - armor_protection)*0.01, 0.1)
if(overmind && damage_flag)
damage_amount = overmind.blobstrain.damage_reaction(src, damage_amount, damage_type, damage_flag)
diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm
index d1d503ba7b95a..a0d6731909a45 100644
--- a/code/modules/antagonists/blob/structures/core.dm
+++ b/code/modules/antagonists/blob/structures/core.dm
@@ -5,7 +5,7 @@
desc = "A huge, pulsating yellow mass."
max_integrity = 400
max_hit_damage = 40
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/blob_core
explosion_block = 6
point_return = -1
health_regen = 0 //we regen in Life() instead of when pulsed
@@ -13,6 +13,11 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob/core)
+
+/datum/armor/blob_core
+ fire = 75
+ acid = 90
+
/obj/structure/blob/core/Initialize(mapload, client/new_overmind = null, placed = 0)
GLOB.blob_cores += src
START_PROCESSING(SSobj, src)
diff --git a/code/modules/antagonists/blob/structures/node.dm b/code/modules/antagonists/blob/structures/node.dm
index 89ba25e521558..9c37078f85973 100644
--- a/code/modules/antagonists/blob/structures/node.dm
+++ b/code/modules/antagonists/blob/structures/node.dm
@@ -5,11 +5,16 @@
desc = "A large, pulsating yellow mass."
max_integrity = 200
max_hit_damage = 40
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 65, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/blob_node
health_regen = 3
point_return = 25
resistance_flags = LAVA_PROOF
+
+/datum/armor/blob_node
+ fire = 65
+ acid = 90
+
/obj/structure/blob/node/Initialize(mapload)
GLOB.blob_nodes += src
START_PROCESSING(SSobj, src)
diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm
index 2246e8ba44c8e..f2eaf33da1d74 100644
--- a/code/modules/antagonists/blob/structures/shield.dm
+++ b/code/modules/antagonists/blob/structures/shield.dm
@@ -9,7 +9,12 @@
explosion_block = 3
point_return = 4
atmosblock = TRUE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/blob_shield
+
+
+/datum/armor/blob_shield
+ fire = 90
+ acid = 90
/obj/structure/blob/shield/scannerreport()
if(atmosblock)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 04a42574b4f6b..2dd7f7d27f288 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -407,13 +407,27 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/gun/magic/tentacle)
item_flags = DROPDEL
clothing_flags = STOPSPRESSUREDAMAGE | HEADINTERNALS //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen)
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 30, BIO = 20, RAD = 20, FIRE = 90, ACID = 90, STAMINA = 10, BLEED = 80)//Bit less armoured than the Syndicate space suit
+ armor_type = /datum/armor/space_changeling
slowdown = 0.2
var/datum/reagent/salbutamol = /datum/reagent/medicine/salbutamol
actions_types = list()
cell = null
show_hud = FALSE
+
+/datum/armor/space_changeling
+ melee = 35
+ bullet = 25
+ laser = 25
+ energy = 30
+ bomb = 30
+ bio = 100
+ rad = 20
+ fire = 90
+ acid = 90
+ stamina = 10
+ bleed = 80
+
/obj/item/clothing/suit/space/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -440,9 +454,23 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/gun/magic/tentacle)
desc = "A covering of armored pressure and temperature-resistant organic tissue with a glass-like chitin front."
item_flags = DROPDEL
clothing_flags = STOPSPRESSUREDAMAGE
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 30, BIO = 20, RAD = 20, FIRE = 90, ACID = 90, STAMINA = 10, BLEED = 80)
+ armor_type = /datum/armor/space_changeling
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+
+/datum/armor/space_changeling
+ melee = 35
+ bullet = 25
+ laser = 25
+ energy = 30
+ bomb = 30
+ bio = 100
+ rad = 20
+ fire = 90
+ acid = 90
+ stamina = 10
+ bleed = 80
+
/obj/item/clothing/head/helmet/space/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -473,13 +501,26 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/gun/magic/tentacle)
item_state = null
item_flags = DROPDEL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30, BLEED = 90)
+ armor_type = /datum/armor/armor_changeling
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
blocks_shove_knockdown = TRUE
slowdown = 0.2
+
+/datum/armor/armor_changeling
+ melee = 40
+ bullet = 40
+ laser = 50
+ energy = 50
+ bomb = 25
+ bio = 10
+ fire = 25
+ acid = 25
+ stamina = 30
+ bleed = 90
+
/obj/item/clothing/suit/armor/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
@@ -492,9 +533,22 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/gun/magic/tentacle)
icon_state = "lingarmorhelmet"
item_state = null
item_flags = DROPDEL
- armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30, BLEED = 90)
+ armor_type = /datum/armor/helmet_changeling
flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
+
+/datum/armor/helmet_changeling
+ melee = 40
+ bullet = 40
+ laser = 50
+ energy = 50
+ bomb = 25
+ bio = 10
+ fire = 25
+ acid = 25
+ stamina = 30
+ bleed = 90
+
/obj/item/clothing/head/helmet/changeling/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
diff --git a/code/modules/antagonists/clock_cult/clockwork_turfs.dm b/code/modules/antagonists/clock_cult/clockwork_turfs.dm
index 67406d57e8c28..0120180ec3744 100644
--- a/code/modules/antagonists/clock_cult/clockwork_turfs.dm
+++ b/code/modules/antagonists/clock_cult/clockwork_turfs.dm
@@ -546,7 +546,7 @@
icon_state = "clockwork_window_single"
resistance_flags = FIRE_PROOF | ACID_PROOF
max_integrity = 80
- armor = list(MELEE = 40, BULLET = -20, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/reinforced_clockwork
explosion_block = 2 //fancy AND hard to destroy. the most useful combination.
decon_speed = 40
glass_type = /obj/item/stack/sheet/brass
@@ -554,6 +554,16 @@
reinf = FALSE
var/made_glow = FALSE
+
+/datum/armor/reinforced_clockwork
+ melee = 40
+ bullet = -20
+ bomb = 25
+ bio = 100
+ rad = 100
+ fire = 80
+ acid = 100
+
/obj/structure/window/reinforced/clockwork/spawnDebris(location)
. = list()
var/gearcount = fulltile ? 4 : 2
diff --git a/code/modules/antagonists/clock_cult/items/brass_clothing.dm b/code/modules/antagonists/clock_cult/items/brass_clothing.dm
index ee87e2bc95b48..f1bbde15854e0 100644
--- a/code/modules/antagonists/clock_cult/items/brass_clothing.dm
+++ b/code/modules/antagonists/clock_cult/items/brass_clothing.dm
@@ -5,7 +5,7 @@
icon_state = "clockwork_cuirass"
worn_icon = 'icons/mob/clothing/suits/armor.dmi'
worn_icon_state = "clockwork_cuirass"
- armor = list(MELEE = 50, BULLET = 60, LASER = 30, ENERGY = 80, BOMB = 80, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60)
+ armor_type = /datum/armor/suit_clockwork
slowdown = 0.6
resistance_flags = FIRE_PROOF | ACID_PROOF
w_class = WEIGHT_CLASS_BULKY
@@ -13,6 +13,20 @@
allowed = list(/obj/item/clockwork, /obj/item/stack/sheet/brass, /obj/item/clockwork, /obj/item/gun/ballistic/bow/clockwork)
var/allow_any = FALSE
+
+/datum/armor/suit_clockwork
+ melee = 50
+ bullet = 60
+ laser = 30
+ energy = 80
+ bomb = 80
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 60
+
/obj/item/clothing/suit/clockwork/anyone
allow_any = TRUE
@@ -43,14 +57,28 @@
worn_icon_state = "clockwork_cuirass_speed"
slowdown = -0.3
resistance_flags = FIRE_PROOF | ACID_PROOF
- armor = list(MELEE = 40, BULLET = 40, LASER = 10, ENERGY = -20, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 30, BLEED = 40)
+ armor_type = /datum/armor/clockwork_speed
+
+
+/datum/armor/clockwork_speed
+ melee = 40
+ bullet = 40
+ laser = 10
+ energy = -20
+ bomb = 60
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 30
+ bleed = 40
/obj/item/clothing/suit/clockwork/cloak
name = "shrouding cloak"
desc = "A faltering cloak that bends light around it, distorting the user's appearance, making it hard to see them with the naked eye. However, it provides very little protection."
icon_state = "clockwork_cloak"
worn_icon_state = "clockwork_cloak"
- armor = list(MELEE = 10, BULLET = 60, LASER = 40, ENERGY = 20, BOMB = 40, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 20, BLEED = 20)
+ armor_type = /datum/armor/clockwork_cloak
slowdown = 0.4
resistance_flags = FIRE_PROOF | ACID_PROOF
var/shroud_active = FALSE
@@ -59,6 +87,20 @@
var/start
var/previous_alpha
+
+/datum/armor/clockwork_cloak
+ melee = 10
+ bullet = 60
+ laser = 40
+ energy = 20
+ bomb = 40
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 20
+ bleed = 20
+
/obj/item/clothing/suit/clockwork/cloak/equipped(mob/user, slot)
. = ..()
if(slot == ITEM_SLOT_OCLOTHING && !shroud_active)
@@ -147,12 +189,26 @@
desc = "A strong, brass helmet worn by the soldiers of the Ratvarian armies. Includes an integrated light-dimmer for flash protection, as well as occult-grade muffling for factory based environments."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_helmet"
- armor = list(MELEE = 50, BULLET = 60, LASER = 30, ENERGY = 80, BOMB = 80, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60)
+ armor_type = /datum/armor/helmet_clockcult
resistance_flags = FIRE_PROOF | ACID_PROOF
w_class = WEIGHT_CLASS_BULKY
flash_protect = 1
bang_protect = 3
+
+/datum/armor/helmet_clockcult
+ melee = 50
+ bullet = 60
+ laser = 30
+ energy = 80
+ bomb = 80
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 60
+
/obj/item/clothing/shoes/clockcult
name = "brass treads"
desc = "A strong pair of brass boots worn by the soldiers of the Ratvarian armies."
@@ -165,11 +221,17 @@
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_gauntlets"
siemens_coefficient = 0
- permeability_coefficient = 0
strip_delay = 80
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0, BLEED = 20)
+ armor_type = /datum/armor/gloves_clockcult
+
+
+/datum/armor/gloves_clockcult
+ bio = 90
+ fire = 80
+ acid = 50
+ bleed = 20
diff --git a/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm b/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm
index 3c3b8fe9cdff3..731b28c05a225 100644
--- a/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm
+++ b/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm
@@ -32,9 +32,17 @@
break_message = "A black ooze leaks from the ocular warden as it slowly sinks to the ground."
icon_state = "ocular_warden"
max_integrity = 60
- armor = list(MELEE = -80, BULLET = -50, LASER = 40, ENERGY = 40, BOMB = 20, BIO = 0, RAD = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/clockwork_ocular_warden
var/cooldown
+
+/datum/armor/clockwork_ocular_warden
+ melee = -80
+ bullet = -50
+ laser = 40
+ energy = 40
+ bomb = 20
+
/obj/structure/destructible/clockwork/ocular_warden/process(delta_time)
//Can we fire?
if(world.time < cooldown)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index 1dfce5d21a625..cf05b79bfbcaf 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -138,12 +138,25 @@ Striking a noncultist, however, will tear their flesh."}
desc = "A torn, dust-caked hood. Strange letters line the inside."
flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
flags_cover = HEADCOVERSEYES
- armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/hooded_cult_hoodie
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
+
+/datum/armor/hooded_cult_hoodie
+ melee = 30
+ bullet = 30
+ laser = 20
+ energy = 20
+ bomb = 25
+ bio = 10
+ fire = 10
+ acid = 10
+ stamina = 40
+ bleed = 20
+
/obj/item/clothing/suit/hooded/cultrobes
name = "ancient cultist robes"
desc = "A ragged, dusty set of robes. Strange letters line the inside."
@@ -154,7 +167,7 @@ Striking a noncultist, however, will tear their flesh."}
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
- armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/hooded_cultrobes
flags_inv = HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|ARMS
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
@@ -162,6 +175,19 @@ Striking a noncultist, however, will tear their flesh."}
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
+
+/datum/armor/hooded_cultrobes
+ melee = 30
+ bullet = 30
+ laser = 20
+ energy = 20
+ bomb = 25
+ bio = 10
+ fire = 10
+ acid = 10
+ stamina = 40
+ bleed = 20
+
/obj/item/clothing/head/hooded/cult_hoodie/alt
name = "cultist hood"
desc = "An armored hood worn by the followers of Nar'Sie."
@@ -188,9 +214,22 @@ Striking a noncultist, however, will tear their flesh."}
item_state = null
desc = "A helm worn by the followers of Nar'Sie."
flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT
- armor = list(MELEE = 50, BULLET = 30, LASER = 50, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 50, BLEED = 50)
+ armor_type = /datum/armor/wizard_magus
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+
+/datum/armor/wizard_magus
+ melee = 50
+ bullet = 30
+ laser = 50
+ energy = 20
+ bomb = 25
+ bio = 10
+ fire = 10
+ acid = 10
+ stamina = 50
+ bleed = 50
+
/obj/item/clothing/suit/magusred
name = "magus robes"
desc = "A set of armored robes worn by the followers of Nar'Sie."
@@ -200,9 +239,22 @@ Striking a noncultist, however, will tear their flesh."}
item_state = null
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
- armor = list(MELEE = 50, BULLET = 30, LASER = 50, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 50, BLEED = 20)
+ armor_type = /datum/armor/suit_magusred
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+
+/datum/armor/suit_magusred
+ melee = 50
+ bullet = 30
+ laser = 50
+ energy = 20
+ bomb = 25
+ bio = 10
+ fire = 10
+ acid = 10
+ stamina = 50
+ bleed = 20
+
/obj/item/sharpener/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
@@ -222,11 +274,25 @@ Striking a noncultist, however, will tear their flesh."}
icon_state = "cult_armor"
item_state = null
w_class = WEIGHT_CLASS_BULKY
- armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/cultrobes_cult_shield
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
/// if anyone can equip this. used by the prefs menu
var/allow_any = FALSE
+
+/datum/armor/cultrobes_cult_shield
+ melee = 40
+ bullet = 30
+ laser = 40
+ energy = 30
+ bomb = 50
+ bio = 30
+ rad = 30
+ fire = 50
+ acid = 60
+ stamina = 40
+ bleed = 20
+
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/anyone
allow_any = TRUE
@@ -253,7 +319,21 @@ Striking a noncultist, however, will tear their flesh."}
name = "empowered cultist helmet"
desc = "A runed helmet scribbed with blood rites which shimmer in the light, reflecting projectiles."
icon_state = "cult_hoodalt"
- armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/cult_hoodie_cult_shield
+
+
+/datum/armor/cult_hoodie_cult_shield
+ melee = 40
+ bullet = 30
+ laser = 40
+ energy = 30
+ bomb = 50
+ bio = 100
+ rad = 30
+ fire = 50
+ acid = 60
+ stamina = 40
+ bleed = 20
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot)
..()
@@ -268,14 +348,30 @@ Striking a noncultist, however, will tear their flesh."}
name = "flagellant's robes"
desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of reduced protection."
allowed = list(/obj/item/tome, /obj/item/melee/cultblade)
- armor = list(MELEE = 10, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/cultrobes_berserker
slowdown = -0.4
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood
+
+/datum/armor/cultrobes_berserker
+ melee = 10
+ bullet = 20
+ laser = 10
+ stamina = 40
+ bleed = 20
+
/obj/item/clothing/head/hooded/cult_hoodie/berserkerhood
name = "flagellant's hood"
desc = "Blood-soaked hood infused with dark magic."
- armor = list(MELEE = 10, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/cult_hoodie_berserkerhood
+
+
+/datum/armor/cult_hoodie_berserkerhood
+ melee = 10
+ bullet = 20
+ laser = 10
+ stamina = 40
+ bleed = 20
/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot)
..()
diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm
index 35815ff66ae45..8b93baa5eb9d0 100644
--- a/code/modules/antagonists/heretic/items/heretic_armor.dm
+++ b/code/modules/antagonists/heretic/items/heretic_armor.dm
@@ -31,7 +31,21 @@
allowed = list(/obj/item/melee/sickly_blade)
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch
// Slightly better than normal cult robes
- armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 20, FIRE = 20, ACID = 20, STAMINA = 50, BLEED = 40)
+ armor_type = /datum/armor/cultrobes_eldritch
+
+
+/datum/armor/cultrobes_eldritch
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 35
+ bio = 20
+ rad = 20
+ fire = 20
+ acid = 20
+ stamina = 50
+ bleed = 40
/obj/item/clothing/suit/hooded/cultrobes/eldritch/examine(mob/user)
. = ..()
@@ -51,7 +65,17 @@
flags_cover = NONE
desc = "Black like tar and doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing."
item_flags = EXAMINE_SKIP
- armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 30, BLEED = 40)
+ armor_type = /datum/armor/cult_hoodie_void
+
+
+/datum/armor/cult_hoodie_void
+ melee = 30
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 15
+ stamina = 30
+ bleed = 40
/obj/item/clothing/head/hooded/cult_hoodie/void/Initialize(mapload)
. = ..()
@@ -66,11 +90,21 @@
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void
flags_inv = NONE
// slightly worse than normal cult robes
- armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 30, BLEED = 40)
+ armor_type = /datum/armor/cultrobes_void
body_parts_covered = CHEST|GROIN|ARMS
pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak
qdel_hood = TRUE
+
+/datum/armor/cultrobes_void
+ melee = 30
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 15
+ stamina = 30
+ bleed = 40
+
/obj/item/clothing/suit/hooded/cultrobes/void/Initialize(mapload)
. = ..()
make_visible()
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index bc199f018ad1b..6dbd32e934acb 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -654,7 +654,7 @@ This is here to make the tiles around the station mininuke change when it's arme
icon_state = "nucleardisk"
persistence_replacement = /obj/item/disk/nuclear/fake
max_integrity = 250
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/disk_nuclear
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/fake = FALSE
var/turf/lastlocation
@@ -663,6 +663,12 @@ This is here to make the tiles around the station mininuke change when it's arme
investigate_flags = ADMIN_INVESTIGATE_TARGET
COOLDOWN_DECLARE(weight_increase_cooldown)
+
+/datum/armor/disk_nuclear
+ bomb = 30
+ fire = 100
+ acid = 100
+
/obj/item/disk/nuclear/Initialize(mapload)
. = ..()
AddElement(/datum/element/bed_tuckable, 6, -6, 0)
diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm
index fd4c1bd5423f5..c14ab9397c015 100644
--- a/code/modules/antagonists/revenant/revenant_blight.dm
+++ b/code/modules/antagonists/revenant/revenant_blight.dm
@@ -10,7 +10,7 @@
agent = "Unholy Forces"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CURABLE
- permeability_mod = 1
+ spreading_modifier = 1
danger = DISEASE_HARMFUL
var/finalstage = 0 //Ensures the final stage effects that should only happen once do not happen repeatedly.
var/startresting
diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm
index b859650e6de62..869dd05f33666 100644
--- a/code/modules/antagonists/space_dragon/carp_rift.dm
+++ b/code/modules/antagonists/space_dragon/carp_rift.dm
@@ -60,7 +60,7 @@
/obj/structure/carp_rift
name = "carp rift"
desc = "A rift akin to the ones space carp use to travel long distances."
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_carp_rift
max_integrity = 300
max_hit_damage = 50
icon = 'icons/obj/carp_rift.dmi'
@@ -87,6 +87,14 @@
/// A list of all the ckeys which have used this carp rift to spawn in as carps.
var/list/ckey_list = list()
+
+/datum/armor/structure_carp_rift
+ energy = 100
+ bomb = 50
+ rad = 100
+ fire = 100
+ acid = 100
+
/obj/structure/carp_rift/Initialize(mapload)
. = ..()
START_PROCESSING(SSobj, src)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 4f07e1fff707c..7bac9a1f585d0 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -70,7 +70,7 @@
req_access = list(ACCESS_ATMOSPHERICS)
max_integrity = 250
integrity_failure = 0.33
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_airalarm
resistance_flags = FIRE_PROOF
clicksound = 'sound/machines/terminal_select.ogg'
layer = ABOVE_WINDOW_LAYER
@@ -107,6 +107,13 @@
GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires
)
+
+/datum/armor/machinery_airalarm
+ energy = 100
+ rad = 100
+ fire = 90
+ acid = 30
+
/obj/machinery/airalarm/server // No checks here.
TLV = list(
"pressure" = new/datum/tlv/no_checks,
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 68aeead0da8bd..efb313a639375 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -34,17 +34,34 @@
var/image/pipe_vision_img = null
+ ///The type of the device (UNARY, BINARY, TRINARY, QUATERNARY)
var/device_type = 0
+ ///The lists of nodes that a pipe/device has, depends on the device_type var (from 1 to 4)
var/list/obj/machinery/atmospherics/nodes
+ ///The path of the pipe/device that will spawn after unwrenching it (such as pipe fittings)
var/construction_type
- var/pipe_state //icon_state as a pipe item
+ ///icon_state as a pipe item
+ var/pipe_state
+ ///Check if the device should be on or off (mostly used in processing for machines)
var/on = FALSE
/// whether it can be painted
var/paintable = FALSE
+ armor_type = /datum/armor/machinery_atmospherics
+
+/datum/armor/machinery_atmospherics
+ melee = 25
+ bullet = 10
+ laser = 10
+ energy = 100
+ rad = 100
+ fire = 100
+ acid = 70
+
/obj/machinery/atmospherics/examine(mob/user)
. = ..()
+ . += "[src] is on layer [piping_layer]."
if(is_type_in_list(src, GLOB.ventcrawl_machinery) && isliving(user))
var/mob/living/L = user
if(L.ventcrawler)
@@ -56,8 +73,6 @@
if(pipe_flags & PIPING_CARDINAL_AUTONORMALIZE)
normalize_cardinal_directions()
nodes = new(device_type)
- if (!armor)
- armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0)
..()
if(process)
SSair.start_processing_machine(src)
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index 24b28222afd05..d9fdb16c92183 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -21,10 +21,6 @@
var/datum/gas_mixture/A = new(200)
airs[i] = A
-/obj/machinery/atmospherics/components/examine(mob/user)
- . = ..()
- . += "[src] is on layer [piping_layer]."
-
/obj/machinery/atmospherics/components/Initialize(mapload)
. = ..()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index 2c46790844080..c88d6db70db3e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -8,7 +8,7 @@
icon_state = "pod-off"
density = TRUE
max_integrity = 350
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/unary_cryo_cell
layer = ABOVE_WINDOW_LAYER
state_open = FALSE
circuit = /obj/item/circuitboard/machine/cryo_tube
@@ -41,6 +41,13 @@
dept_req_for_free = ACCOUNT_MED_BITFLAG
+
+/datum/armor/unary_cryo_cell
+ energy = 100
+ rad = 100
+ fire = 30
+ acid = 30
+
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize(mapload)
. = ..()
initialize_directions = dir
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index 582a53629a376..b817e723765c0 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -7,7 +7,7 @@
density = TRUE
max_integrity = 300
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/unary_thermomachine
layer = OBJ_LAYER
circuit = /obj/item/circuitboard/machine/thermomachine
@@ -28,6 +28,13 @@
var/base_heating = 140
var/base_cooling = 170
+
+/datum/armor/unary_thermomachine
+ energy = 100
+ rad = 100
+ fire = 80
+ acid = 30
+
/obj/machinery/atmospherics/components/unary/thermomachine/Initialize(mapload)
. = ..()
initialize_directions = dir
diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm
index 91c8e8bad1f7e..3be8ca2adf5eb 100644
--- a/code/modules/atmospherics/machinery/other/meter.dm
+++ b/code/modules/atmospherics/machinery/other/meter.dm
@@ -9,11 +9,17 @@
idle_power_usage = 2
active_power_usage = 4
max_integrity = 150
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 40, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_meter
var/frequency = 0
var/atom/target
var/target_layer = PIPING_LAYER_DEFAULT
+
+/datum/armor/machinery_meter
+ energy = 100
+ rad = 100
+ fire = 40
+
/obj/machinery/meter/atmos
frequency = FREQ_ATMOS_STORAGE
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index fe07d92789a8d..4438640af5597 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -1,4 +1,5 @@
/obj/machinery/atmospherics/pipe
+ damage_deflection = 12
var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke
var/volume = 0
@@ -30,10 +31,6 @@
if(hide)
AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE)
-/obj/machinery/atmospherics/pipe/examine(mob/user)
- . = ..()
- . += "[src] is on layer [piping_layer]."
-
/obj/machinery/atmospherics/pipe/nullifyNode(i)
var/obj/machinery/atmospherics/oldN = nodes[i]
..()
@@ -106,11 +103,6 @@
/obj/machinery/atmospherics/pipe/returnPipenets()
. = list(parent)
-/obj/machinery/atmospherics/pipe/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == MELEE && damage_amount < 12)
- return 0
- . = ..()
-
/obj/machinery/atmospherics/pipe/paint(paint_color)
if(paintable)
add_atom_colour(paint_color, FIXED_COLOUR_PRIORITY)
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 9939d30ac3fb9..f49774f594643 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -9,7 +9,7 @@
greyscale_colors = "#ffff00#000000"
density = TRUE
volume = 1000
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/portable_atmospherics_canister
max_integrity = 250
integrity_failure = 0.4
pressure_resistance = 7 * ONE_ATMOSPHERE
@@ -54,6 +54,17 @@
"caution" = /obj/machinery/portable_atmospherics/canister,
)
+
+/datum/armor/portable_atmospherics_canister
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 100
+ bomb = 10
+ rad = 100
+ fire = 80
+ acid = 50
+
/obj/machinery/portable_atmospherics/canister/Initialize(mapload)
. = ..()
AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/canister_valve))
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 36f8f066a4066..f3d99ed130dca 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/atmos.dmi'
use_power = NO_POWER_USE
max_integrity = 250
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 60, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_portable_atmospherics
anchored = FALSE
interacts_with_air = TRUE
@@ -14,6 +14,13 @@
var/volume = 0
var/maximum_pressure = 90 * ONE_ATMOSPHERE
+
+/datum/armor/machinery_portable_atmospherics
+ energy = 100
+ rad = 100
+ fire = 60
+ acid = 30
+
/obj/machinery/portable_atmospherics/Initialize(mapload)
. = ..()
air_contents = new(volume)
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index ddaa55e29a903..46f0ea0a6b85f 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -12,7 +12,7 @@
delivery_icon = null
can_weld_shut = FALSE
divable = FALSE
- armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/closet_supplypod
anchored = TRUE //So it cant slide around after landing
anchorable = FALSE
flags_1 = PREVENT_CONTENTS_EXPLOSION_1
@@ -60,6 +60,16 @@
var/list/reverse_option_list = list("Mobs"=FALSE,"Objects"=FALSE,"Anchored"=FALSE,"Underfloor"=FALSE,"Wallmounted"=FALSE,"Floors"=FALSE,"Walls"=FALSE, "Mecha"=FALSE)
var/list/turfs_in_cargo = list()
+
+/datum/armor/closet_supplypod
+ melee = 30
+ bullet = 50
+ laser = 50
+ energy = 100
+ bomb = 100
+ fire = 100
+ acid = 80
+
/obj/structure/closet/supplypod/bluespacepod
style = STYLE_BLUESPACE
bluespace = TRUE
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index dae76be69e01c..d5a06748e8673 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -356,10 +356,21 @@
random_sensor = FALSE
resistance_flags = NONE
can_adjust = FALSE
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/under_chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
+
+/datum/armor/under_chameleon
+ melee = 10
+ bullet = 10
+ laser = 10
+ bio = 10
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/under/chameleon/envirosuit
name = "plasma envirosuit"
desc = "A special containment suit that allows plasma-based lifeforms to exist safely in an oxygenated environment, and automatically extinguishes them in a crisis. Despite being airtight, it's not spaceworthy. It has a small dial on the wrist."
@@ -433,10 +444,20 @@
item_state = "armor"
blood_overlay_type = "armor"
resistance_flags = NONE
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/suit_chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
+
+/datum/armor/suit_chameleon
+ melee = 10
+ bullet = 10
+ laser = 10
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/suit/chameleon/Initialize(mapload)
. = ..()
chameleon_action = new(src)
@@ -477,10 +498,20 @@
icon_state = "meson"
item_state = "meson"
resistance_flags = NONE
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/glasses_chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
+
+/datum/armor/glasses_chameleon
+ melee = 10
+ bullet = 10
+ laser = 10
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/glasses/chameleon/Initialize(mapload)
. = ..()
chameleon_action = new(src)
@@ -530,10 +561,20 @@
worn_icon_state = "ygloves"
resistance_flags = NONE
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/gloves_chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
+
+/datum/armor/gloves_chameleon
+ melee = 10
+ bullet = 10
+ laser = 10
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/gloves/chameleon/Initialize(mapload)
. = ..()
chameleon_action = new(src)
@@ -575,13 +616,23 @@
item_state = "combatgloves"
worn_icon_state = "combatgloves"
siemens_coefficient = 0
- permeability_coefficient = 0.05
strip_delay = 80
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/chameleon_combat
+
+
+/datum/armor/chameleon_combat
+ melee = 10
+ bullet = 10
+ laser = 10
+ bio = 50
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
/obj/item/clothing/head/chameleon
name = "grey cap"
@@ -591,10 +642,20 @@
clothing_flags = SNUG_FIT
icon_state = "greysoft"
resistance_flags = NONE
- armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/head_chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
+
+/datum/armor/head_chameleon
+ melee = 5
+ bullet = 5
+ laser = 5
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/head/chameleon/Initialize(mapload)
. = ..()
chameleon_action = new(src)
@@ -655,7 +716,7 @@
// The camohat, I mean, holographic hat projection, is part of the
// drone itself.
clothing_flags = SNUG_FIT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
// which means it offers no protection, it's just air and light
/obj/item/clothing/head/chameleon/drone/Initialize(mapload)
@@ -709,11 +770,10 @@
icon_state = "gas_alt"
item_state = "gas_alt"
resistance_flags = NONE
- armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/mask_chameleon
clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
voice_change = TRUE
@@ -721,6 +781,17 @@
var/datum/action/item_action/chameleon/change/chameleon_action
var/datum/action/item_action/chameleon/tongue_change/tongue_action
+
+/datum/armor/mask_chameleon
+ melee = 5
+ bullet = 5
+ laser = 5
+ bio = 100
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/mask/chameleon/Initialize(mapload)
. = ..()
chameleon_action = new(src)
@@ -778,10 +849,14 @@
/obj/item/clothing/mask/chameleon/drone
//Same as the drone chameleon hat, undroppable and no protection
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 10)
+ armor_type = /datum/armor/chameleon_drone
// Can drones use the voice changer part? Let's not find out.
voice_change = FALSE
+
+/datum/armor/chameleon_drone
+ bleed = 10
+
/obj/item/clothing/mask/chameleon/drone/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
@@ -801,13 +876,23 @@
greyscale_config = /datum/greyscale_config/sneakers
greyscale_config_worn = /datum/greyscale_config/sneakers_worn
desc = "A pair of black shoes."
- permeability_coefficient = 0.05
resistance_flags = NONE
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/shoes_chameleon
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
var/datum/action/item_action/chameleon/change/chameleon_action
+
+/datum/armor/shoes_chameleon
+ melee = 10
+ bullet = 10
+ laser = 10
+ bio = 90
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/shoes/chameleon/Initialize(mapload)
. = ..()
chameleon_action = new(src)
@@ -1043,7 +1128,12 @@
desc = "A neosilk clip-on tie."
icon_state = "blacktie"
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/neck_chameleon
+
+
+/datum/armor/neck_chameleon
+ fire = 50
+ acid = 50
/obj/item/clothing/neck/chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index eac5ae75c28e6..b6024ce90bb99 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -136,7 +136,7 @@
var/obj/item/organ/tongue/tongue = attacker.getorganslot(ORGAN_SLOT_TONGUE)
if(!istype(tongue, /obj/item/organ/tongue/moth) && !istype(tongue, /obj/item/organ/tongue/psyphoza))
return ..() //Not a clotheater tongue? No Clotheating!
- if((clothing_flags & NOTCONSUMABLE) && (resistance_flags & INDESTRUCTIBLE) && (armor.getRating(MELEE) != 0))
+ if((clothing_flags & NOTCONSUMABLE) && (resistance_flags & INDESTRUCTIBLE) && (get_armor_rating(MELEE) != 0))
return ..() //Any remaining flags that make eating it impossible?
if (isnull(moth_snack))
@@ -327,46 +327,36 @@
how_cool_are_your_threads += ""
. += how_cool_are_your_threads.Join()
- if(armor.bio || armor.bomb || armor.bullet || armor.energy || armor.laser || armor.melee || armor.fire || armor.acid || armor.stamina || (flags_cover & HEADCOVERSMOUTH))
+ if(get_armor().has_any_armor() || (flags_cover & HEADCOVERSMOUTH))
. += "It has a tag listing its protection classes."
/obj/item/clothing/Topic(href, href_list)
. = ..()
if(href_list["list_armor"])
- var/obj/item/clothing/compare_to = null
- for (var/flag in bitfield_to_list(slot_flags))
- var/thing = usr.get_item_by_slot(flag)
- if (istype(thing, /obj/item/clothing))
- compare_to = thing
- break
var/list/readout = list("PROTECTION CLASSES")
- if(armor.bio || armor.bomb || armor.bullet || armor.energy || armor.laser || armor.melee || armor.rad || armor.stamina || armor.bleed)
- readout += "
ARMOR (I-X)"
- if(armor.bio || compare_to?.armor?.bio)
- readout += "
TOXIN [armor_to_protection_class(armor.bio, compare_to?.armor?.bio)]"
- if(armor.bomb || compare_to?.armor?.bomb)
- readout += "
EXPLOSIVE [armor_to_protection_class(armor.bomb, compare_to?.armor?.bomb)]"
- if(armor.bullet || compare_to?.armor?.bullet)
- readout += "
BULLET [armor_to_protection_class(armor.bullet, compare_to?.armor?.bullet)]"
- if(armor.energy || compare_to?.armor?.energy)
- readout += "
ENERGY [armor_to_protection_class(armor.energy, compare_to?.armor?.energy)]"
- if(armor.laser || compare_to?.armor?.laser)
- readout += "
LASER [armor_to_protection_class(armor.laser, compare_to?.armor?.laser)]"
- if(armor.melee || compare_to?.armor?.melee)
- readout += "
MELEE [armor_to_protection_class(armor.melee, compare_to?.armor?.melee)]"
- if(armor.rad || compare_to?.armor?.rad)
- readout += "
RADIATION [armor_to_protection_class(armor.rad, compare_to?.armor?.rad)]"
- if(armor.stamina || compare_to?.armor?.stamina)
- readout += "
STAMINA [armor_to_protection_class(armor.stamina, compare_to?.armor?.stamina)]"
- if(armor.bleed || compare_to?.armor?.bleed)
- readout += "
BLEEDING [armor_to_protection_class(armor.bleed, compare_to?.armor?.bleed)]"
- if(armor.fire || armor.acid)
- readout += "
DURABILITY (I-X)"
- if(armor.fire || compare_to?.armor?.fire)
- readout += "
FIRE [armor_to_protection_class(armor.fire, compare_to?.armor?.fire)]"
- if(armor.acid || compare_to?.armor?.acid)
- readout += "
ACID [armor_to_protection_class(armor.acid, compare_to?.armor?.acid)]"
+
+ var/datum/armor/armor = get_armor()
+ var/added_damage_header = FALSE
+ for(var/damage_key in ARMOR_LIST_DAMAGE)
+ var/rating = armor.get_rating(damage_key)
+ if(!rating)
+ continue
+ if(!added_damage_header)
+ readout += "\nARMOR (I-X)"
+ added_damage_header = TRUE
+ readout += "\n[armor_to_protection_name(damage_key)] [armor_to_protection_class(rating)]"
+
+ var/added_durability_header = FALSE
+ for(var/durability_key in ARMOR_LIST_DURABILITY)
+ var/rating = armor.get_rating(durability_key)
+ if(!rating)
+ continue
+ if(!added_durability_header)
+ readout += "\nDURABILITY (I-X)"
+ added_damage_header = TRUE
+ readout += "\n[armor_to_protection_name(durability_key)] [armor_to_protection_class(durability_key)]"
+
if(flags_cover & HEADCOVERSMOUTH)
readout += "
COVERAGE"
readout += "
It will block Facehuggers."
@@ -588,15 +578,17 @@ BLIND // can't see anything
if(prob(0.2))
to_chat(L, "The damaged threads on your [src.name] chafe!")
-/obj/item/clothing/get_armor_rating(d_type, mob/wearer)
+/*
+/obj/item/clothing/get_armor_rating(d_type)
. = ..()
if(high_pressure_multiplier == 1)
return
- var/turf/T = get_turf(wearer)
+ var/turf/T = get_turf(usr)
if(!T || !(d_type in high_pressure_multiplier_types))
return
if(!lavaland_equipment_pressure_check(T))
. *= high_pressure_multiplier
+*/
#undef SENSORS_OFF
#undef SENSORS_BINARY
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index 9e3006db1c6f1..5741630d0d3f4 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -144,7 +144,12 @@
actions_types = list(/datum/action/item_action/toggle_research_scanner)
glass_colour_type = /datum/client_colour/glass_colour/purple
resistance_flags = ACID_PROOF
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/glasses_science
+
+
+/datum/armor/glasses_science
+ fire = 80
+ acid = 100
/obj/item/clothing/glasses/science/item_action_slot_check(slot)
if(slot == ITEM_SLOT_EYES)
@@ -156,9 +161,14 @@
icon_state = "prescscihud"
emissive_state = "prehud_emissive"
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/science_prescription
vision_correction = 1
+
+/datum/armor/science_prescription
+ fire = 20
+ acid = 40
+
/obj/item/clothing/glasses/science/sciencesun
name = "science sunglasses"
desc = "A pair of sunglasses outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion. Has enhanced shielding which blocks flashes."
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 9fec37410bc64..d3269f760b9d3 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -7,10 +7,14 @@
item_state = "ygloves"
worn_icon_state = "ygloves"
siemens_coefficient = 0
- permeability_coefficient = 0.05
+ armor_type = /datum/armor/color_yellow
resistance_flags = NONE
cut_type = /obj/item/clothing/gloves/cut
+
+/datum/armor/color_yellow
+ bio = 50
+
/obj/item/clothing/gloves/color/black/equipped(mob/user, slot)
. = ..()
if((slot == ITEM_SLOT_GLOVES) && (user.mind?.assigned_role in SSdepartment.get_jobs_by_dept_id(DEPT_NAME_SECURITY)))
@@ -41,17 +45,21 @@
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "sec_insulated_gloves")
-/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
+/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap knockoffs of the coveted ones - no way this can end badly."
name = "budget insulated gloves"
icon_state = "yellow"
item_state = "ygloves"
worn_icon_state = "ygloves"
- siemens_coefficient = 1 //Set to a default of 1, gets overridden in Initialize()
- permeability_coefficient = 0.05
+ siemens_coefficient = 1 //Set to a default of 1, gets overridden in Initialize()
+ armor_type = /datum/armor/color_fyellow
resistance_flags = NONE
cut_type = /obj/item/clothing/gloves/cut
+
+/datum/armor/color_fyellow
+ bio = 25
+
/obj/item/clothing/gloves/color/fyellow/Initialize(mapload)
. = ..()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
@@ -106,7 +114,7 @@
name = "insulated gloves"
desc = "These gloves provide protection against electric shock."
siemens_coefficient = 0
- permeability_coefficient = 0.05
+ armor_type = /datum/armor/none
resistance_flags = NONE
/obj/item/clothing/gloves/color/rainbow
@@ -172,13 +180,18 @@
item_state = "egloves"
worn_icon_state = "egloves"
siemens_coefficient = 0
- permeability_coefficient = 0.05
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 60
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/color_captain
+
+
+/datum/armor/color_captain
+ bio = 90
+ fire = 70
+ acid = 50
/obj/item/clothing/gloves/color/latex
name = "latex gloves"
@@ -187,11 +200,15 @@
item_state = "latex"
worn_icon_state = "latex"
siemens_coefficient = 0.3
- permeability_coefficient = 0.01
+ armor_type = /datum/armor/color_latex
transfer_prints = TRUE
resistance_flags = NONE
var/carrytrait = TRAIT_QUICKER_CARRY
+
+/datum/armor/color_latex
+ bio = 100
+
/obj/item/clothing/gloves/color/latex/equipped(mob/user, slot)
..()
if(slot == ITEM_SLOT_GLOVES)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index e993df33d96ca..8b4cb3ca851ec 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -19,13 +19,18 @@
icon_state = "leather"
item_state = "ggloves"
worn_icon_state = "ggloves"
- permeability_coefficient = 0.9
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/gloves_botanic_leather
+
+
+/datum/armor/gloves_botanic_leather
+ bio = 50
+ fire = 70
+ acid = 30
/obj/item/clothing/gloves/combat
name = "combat gloves"
@@ -34,14 +39,21 @@
item_state = "combatgloves"
worn_icon_state = "combatgloves"
siemens_coefficient = 0
- permeability_coefficient = 0.05
strip_delay = 80
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 20, BLEED = 10)
+ armor_type = /datum/armor/gloves_combat
+
+
+/datum/armor/gloves_combat
+ bio = 90
+ fire = 80
+ acid = 50
+ stamina = 20
+ bleed = 10
/obj/item/clothing/gloves/bracer
name = "bone bracers"
@@ -57,7 +69,19 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
- armor = list(MELEE = 15, BULLET = 35, LASER = 35, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0, STAMINA = 20, BLEED = 20)
+ armor_type = /datum/armor/gloves_bracer
+
+
+/datum/armor/gloves_bracer
+ melee = 15
+ bullet = 35
+ laser = 35
+ energy = 20
+ bomb = 35
+ bio = 35
+ rad = 35
+ stamina = 20
+ bleed = 20
/obj/item/clothing/gloves/rapid
name = "Gloves of the North Star"
diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm
index 5e2360d757310..2867783db3c19 100644
--- a/code/modules/clothing/head/beanie.dm
+++ b/code/modules/clothing/head/beanie.dm
@@ -89,7 +89,19 @@
name = "durathread beanie"
desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beaniedurathread"
- armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 5, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, STAMINA = 20, BLEED = 40)
+ armor_type = /datum/armor/beanie_durathread
+
+
+/datum/armor/beanie_durathread
+ melee = 15
+ bullet = 25
+ laser = 15
+ energy = 5
+ bomb = 10
+ fire = 30
+ acid = 5
+ stamina = 20
+ bleed = 40
/obj/item/clothing/head/beanie/waldo
name = "red striped bobble hat"
diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm
index c461b585a9c62..026d44ae47604 100644
--- a/code/modules/clothing/head/cakehat.dm
+++ b/code/modules/clothing/head/cakehat.dm
@@ -10,7 +10,7 @@
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
hitsound = 'sound/weapons/tap.ogg'
flags_inv = HIDEEARS|HIDEHAIR
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/none
light_range = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
heat = 1000 //use round numbers, guh
diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm
index 23e23c5b6dcd0..e7b270d083120 100644
--- a/code/modules/clothing/head/costume.dm
+++ b/code/modules/clothing/head/costume.dm
@@ -126,7 +126,16 @@
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_helmet_old"
flags_inv = HIDEEARS|HIDEHAIR
- armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 20, STAMINA = 30)
+ armor_type = /datum/armor/costume_bronze
+
+
+/datum/armor/costume_bronze
+ melee = 5
+ laser = -5
+ bomb = 10
+ fire = 20
+ acid = 20
+ stamina = 30
/obj/item/clothing/head/hooded/flashsuit
name = "flash button"
@@ -163,11 +172,24 @@
desc = "Spaceworthy and it looks like a space carp's head, smells like one too."
icon_state = "carp_helm"
item_state = "syndicate"
- armor = list(MELEE = 20, BULLET = 10, LASER = 20, ENERGY = 20, BOMB = 30, BIO = 100, RAD = 75, FIRE = 60, ACID = 75, STAMINA = 40)
+ armor_type = /datum/armor/carp_hood_spaceproof
light_system = NO_LIGHT_SUPPORT
light_range = 0 //luminosity when on
actions_types = list()
+
+/datum/armor/carp_hood_spaceproof
+ melee = 20
+ bullet = 10
+ laser = 20
+ energy = 20
+ bomb = 30
+ bio = 100
+ rad = 75
+ fire = 60
+ acid = 75
+ stamina = 40
+
/obj/item/clothing/head/hooded/carp_hood/spaceproof/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
@@ -175,16 +197,25 @@
/obj/item/clothing/head/hooded/carp_hood/spaceproof/old
name = "battered carp helmet"
desc = "It's covered in bite marks and scratches, yet seems to be still perfectly functional."
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10)
+ armor_type = /datum/armor/spaceproof_old
+
+
+/datum/armor/spaceproof_old
+ bio = 100
+ rad = 50
+ fire = 80
+ acid = 70
+ stamina = 10
/obj/item/clothing/suit/hooded/carp_costume/spaceproof/old
name = "battered carp space suit"
desc = "It's covered in bite marks and scratches, yet seems to be still perfectly functional."
slowdown = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10)
+ armor_type = /datum/armor/spaceproof_old
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/multitool)
hoodtype = /obj/item/clothing/head/hooded/carp_hood/spaceproof/old
+
/obj/item/clothing/head/hooded/ian_hood
name = "corgi hood"
desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
@@ -209,11 +240,31 @@
/obj/item/clothing/suit/hooded/bee_costume/syndie
name = "BLF costume"
- armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 40, BOMB = 0, BIO = 60, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 40)
+ armor_type = /datum/armor/bee_costume_syndie
hoodtype = /obj/item/clothing/head/hooded/bee_hood/syndie
+
+/datum/armor/bee_costume_syndie
+ melee = 20
+ bullet = 20
+ laser = 20
+ energy = 40
+ bio = 60
+ acid = 50
+ stamina = 40
+
/obj/item/clothing/head/hooded/bee_hood/syndie
- armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 40, BOMB = 0, BIO = 60, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 40)
+ armor_type = /datum/armor/bee_hood_syndie
+
+
+/datum/armor/bee_hood_syndie
+ melee = 20
+ bullet = 20
+ laser = 20
+ energy = 40
+ bio = 60
+ acid = 50
+ stamina = 40
/obj/item/clothing/head/hooded/human_head
name = "bloated human head"
diff --git a/code/modules/clothing/head/crown.dm b/code/modules/clothing/head/crown.dm
index 885baaccb51d0..9119a9c00510d 100644
--- a/code/modules/clothing/head/crown.dm
+++ b/code/modules/clothing/head/crown.dm
@@ -2,10 +2,18 @@
name = "crown"
desc = "A crown fit for a king, a petty king maybe."
icon_state = "crown"
- armor = list(MELEE = 15, BULLET = 0, LASER = 0, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 40)
+ armor_type = /datum/armor/costume_crown
resistance_flags = FIRE_PROOF
dynamic_hair_suffix = ""
+
+/datum/armor/costume_crown
+ melee = 15
+ energy = 15
+ fire = 100
+ acid = 50
+ stamina = 40
+
/obj/item/clothing/head/costume/crown/fancy
name = "magnificent crown"
desc = "A crown worn by only the highest emperors of the land space."
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 53a77aaffcd89..8376cba81b934 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -7,7 +7,7 @@
desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight."
icon_state = "hardhat0_yellow"
item_state = null
- armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, STAMINA = 20, BLEED = 60)
+ armor_type = /datum/armor/utility_hardhat
flags_inv = NONE
actions_types = list(/datum/action/item_action/toggle_helmet_light)
resistance_flags = FIRE_PROOF
@@ -24,6 +24,20 @@
///Whether the headlamp is on or off.
var/on = FALSE
+
+/datum/armor/utility_hardhat
+ melee = 15
+ bullet = 5
+ laser = 20
+ energy = 10
+ bomb = 20
+ bio = 50
+ rad = 20
+ fire = 100
+ acid = 50
+ stamina = 20
+ bleed = 60
+
/obj/item/clothing/head/utility/hardhat/Initialize(mapload)
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
@@ -173,10 +187,14 @@
hat_type = "pumpkin"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
clothing_flags = SNUG_FIT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10)
+ armor_type = /datum/armor/hardhat_pumpkinhead
light_range = 2 //luminosity when on
flags_cover = HEADCOVERSEYES
+
+/datum/armor/hardhat_pumpkinhead
+ stamina = 10
+
/obj/item/clothing/head/utility/hardhat/reindeer
name = "novelty reindeer hat"
desc = "Some fake antlers and a very fake red nose."
@@ -187,7 +205,7 @@
item_state = null
hat_type = "reindeer"
flags_inv = 0
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/none
light_range = 1 //luminosity when on
dynamic_hair_suffix = ""
diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm
index 1ec1a0b6b5979..1268d3d015a64 100644
--- a/code/modules/clothing/head/hat.dm
+++ b/code/modules/clothing/head/hat.dm
@@ -8,19 +8,41 @@
desc = "It's good to be emperor."
item_state = "that"
flags_inv = NONE
- armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30)
+ armor_type = /datum/armor/hats_centhat
strip_delay = 80
clothing_flags = SNUG_FIT // prevents bypassing the strip delay
+
+/datum/armor/hats_centhat
+ melee = 30
+ bullet = 15
+ laser = 30
+ energy = 10
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+
/obj/item/clothing/head/hats/centcom_cap
name = "\improper CentCom commander cap"
icon_state = "centcom_cap"
desc = "Worn by the finest of CentCom commanders. Inside the lining of the cap, lies two faint initials."
item_state = "that"
flags_inv = 0
- armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30)
+ armor_type = /datum/armor/hats_centcom_cap
strip_delay = (8 SECONDS)
+
+/datum/armor/hats_centcom_cap
+ melee = 30
+ bullet = 15
+ laser = 30
+ energy = 10
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+
/obj/item/clothing/head/costume/canada
name = "striped red tophat"
desc = "It smells like fresh donut holes. / Il sent comme des trous de beignets frais."
@@ -43,10 +65,13 @@
item_state = "that"
icon_state = "plaguedoctor"
clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT
- permeability_coefficient = 0.01
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/costume_plague
flags_inv = HIDEHAIR
+
+/datum/armor/costume_plague
+ bio = 100
+
/obj/item/clothing/head/costume/nursehat
name = "nurse's hat"
desc = "It allows quick identification of trained medical personnel."
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 9f53df84a6946..57a0b0127605c 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -5,7 +5,7 @@
worn_icon = 'icons/mob/clothing/head/helmet.dmi'
icon_state = "helmet"
item_state = "helmet"
- armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 50)
+ armor_type = /datum/armor/head_helmet
flags_inv = HIDEEARS
cold_protection = HEAD
heat_protection = HEAD
@@ -18,6 +18,18 @@
bang_protect = 1
clothing_flags = THICKMATERIAL
+
+/datum/armor/head_helmet
+ melee = 35
+ bullet = 30
+ laser = 30
+ energy = 40
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 50
+
/obj/item/clothing/head/helmet/Initialize(mapload)
. = ..()
AddElement(/datum/element/update_icon_updates_onmob)
@@ -57,7 +69,19 @@
desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "helmetalt"
item_state = "helmetalt"
- armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 15, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 50)
+ armor_type = /datum/armor/helmet_alt
+
+
+/datum/armor/helmet_alt
+ melee = 15
+ bullet = 60
+ laser = 10
+ energy = 15
+ bomb = 40
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 50
/obj/item/clothing/head/helmet/alt/Initialize(mapload)
. = ..()
@@ -116,7 +140,7 @@
item_state = "helmet"
toggle_message = "You pull the visor down on"
alt_toggle_message = "You push the visor up on"
- armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/toggleable_riot
flags_inv = HIDEEARS|HIDEFACE|HIDESNOUT
strip_delay = 80
actions_types = list(/datum/action/item_action/toggle)
@@ -124,6 +148,17 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+
+/datum/armor/toggleable_riot
+ melee = 50
+ bullet = 10
+ laser = 10
+ energy = 15
+ fire = 80
+ acid = 80
+ stamina = 50
+ bleed = 70
+
/obj/item/clothing/head/helmet/toggleable/riot/Initialize(mapload)
. = ..()
AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight")
@@ -172,7 +207,7 @@
desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern."
icon_state = "swatsyndie"
item_state = "swatsyndie"
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 90, RAD = 20, FIRE = 50, ACID = 50, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/helmet_swat
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -180,6 +215,20 @@
clothing_flags = STOPSPRESSUREDAMAGE | SNUG_FIT
strip_delay = 80
+
+/datum/armor/helmet_swat
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 40
+ bomb = 50
+ bio = 90
+ rad = 20
+ fire = 50
+ acid = 50
+ stamina = 50
+ bleed = 70
+
/obj/item/clothing/head/helmet/police
name = "police officer's hat"
desc = "A police officer's Hat. This hat emphasizes that you are THE LAW."
@@ -198,32 +247,64 @@
flags_inv = HIDEEARS|HIDEHAIR
icon_state = "thunderdome"
item_state = "thunderdome"
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/helmet_thunderdome
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
strip_delay = 80
+
+/datum/armor/helmet_thunderdome
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 50
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 90
+ acid = 90
+
/obj/item/clothing/head/helmet/thunderdome/holosuit
cold_protection = null
heat_protection = null
- armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/thunderdome_holosuit
+
+
+/datum/armor/thunderdome_holosuit
+ melee = 10
+ bullet = 10
/obj/item/clothing/head/helmet/roman
name = "\improper Roman helmet"
desc = "An ancient helmet made of bronze and leather."
flags_inv = HIDEEARS|HIDEHAIR
flags_cover = HEADCOVERSEYES
- armor = list(MELEE = 25, BULLET = 0, LASER = 25, ENERGY = 30, BOMB = 10, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 40, BLEED = 50)
+ armor_type = /datum/armor/helmet_roman
resistance_flags = FIRE_PROOF
icon_state = "roman"
item_state = "roman"
strip_delay = 100
+
+/datum/armor/helmet_roman
+ melee = 25
+ laser = 25
+ energy = 30
+ bomb = 10
+ fire = 100
+ acid = 50
+ stamina = 40
+ bleed = 50
+
/obj/item/clothing/head/helmet/roman/fake
desc = "An ancient helmet made of plastic and leather."
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 10)
+ armor_type = /datum/armor/roman_fake
+
+
+/datum/armor/roman_fake
+ bleed = 10
/obj/item/clothing/head/helmet/roman/legionnaire
name = "\improper Roman legionnaire helmet"
@@ -233,7 +314,11 @@
/obj/item/clothing/head/helmet/roman/legionnaire/fake
desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it."
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 10)
+ armor_type = /datum/armor/legionnaire_fake
+
+
+/datum/armor/legionnaire_fake
+ bleed = 10
/obj/item/clothing/head/helmet/gladiator
name = "gladiator helmet"
@@ -249,7 +334,18 @@
icon_state = "redtaghelm"
flags_cover = HEADCOVERSEYES
item_state = "redtaghelm"
- armor = list(MELEE = 15, BULLET = 10, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/helmet_redtaghelm
+
+
+/datum/armor/helmet_redtaghelm
+ melee = 15
+ bullet = 10
+ laser = 20
+ energy = 30
+ bomb = 20
+ acid = 50
+ stamina = 10
+ bleed = 10
/obj/item/clothing/head/helmet/bluetaghelm
name = "blue laser tag helmet"
@@ -257,19 +353,41 @@
icon_state = "bluetaghelm"
flags_cover = HEADCOVERSEYES
item_state = "bluetaghelm"
- armor = list(MELEE = 15, BULLET = 10, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/helmet_bluetaghelm
+
+
+/datum/armor/helmet_bluetaghelm
+ melee = 15
+ bullet = 10
+ laser = 20
+ energy = 30
+ bomb = 20
+ acid = 50
+ stamina = 10
+ bleed = 10
/obj/item/clothing/head/helmet/knight
name = "medieval helmet"
desc = "A classic metal helmet."
icon_state = "knight_green"
item_state = "knight_green"
- armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 10)
+ armor_type = /datum/armor/helmet_knight
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
bang_protect = 1
+
+/datum/armor/helmet_knight
+ melee = 50
+ bullet = 10
+ laser = 10
+ energy = 10
+ fire = 80
+ acid = 80
+ stamina = 50
+ bleed = 10
+
/obj/item/clothing/head/helmet/knight/blue
icon_state = "knight_blue"
item_state = "knight_blue"
@@ -287,28 +405,64 @@
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT
flags_cover = HEADCOVERSEYES
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 40)
+ armor_type = /datum/armor/helmet_skull
icon_state = "skull"
item_state = "skull"
strip_delay = 100
+
+/datum/armor/helmet_skull
+ melee = 35
+ bullet = 25
+ laser = 25
+ energy = 10
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 20
+ bleed = 40
+
/obj/item/clothing/head/helmet/durathread
name = "durathread helmet"
desc = "A helmet made from durathread, a strong material commonly used for ballistic protection."
icon_state = "durathread"
item_state = "durathread"
resistance_flags = FLAMMABLE
- armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 5, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 50, STAMINA = 30, BLEED = 60)
+ armor_type = /datum/armor/helmet_durathread
strip_delay = 60
+
+/datum/armor/helmet_durathread
+ melee = 20
+ bullet = 40
+ laser = 30
+ energy = 5
+ bomb = 15
+ fire = 40
+ acid = 50
+ stamina = 30
+ bleed = 60
+
/obj/item/clothing/head/helmet/rus_helmet
name = "russian helmet"
desc = "It can hold a bottle of vodka."
icon_state = "rus_helmet"
item_state = "rus_helmet"
- armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, STAMINA = 20, BLEED = 15)
+ armor_type = /datum/armor/helmet_rus_helmet
pocket_storage_component_path = /datum/component/storage/concrete/pockets/helmet
+
+/datum/armor/helmet_rus_helmet
+ melee = 25
+ bullet = 30
+ energy = 15
+ bomb = 10
+ rad = 20
+ fire = 20
+ acid = 50
+ stamina = 20
+ bleed = 15
+
/obj/item/clothing/head/helmet/rus_ushanka
name = "battle ushanka"
desc = "100% bear."
@@ -317,7 +471,21 @@
body_parts_covered = HEAD
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
- armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, STAMINA = 20, BLEED = 15)
+ armor_type = /datum/armor/helmet_rus_ushanka
+
+
+/datum/armor/helmet_rus_ushanka
+ melee = 25
+ bullet = 20
+ laser = 20
+ energy = 10
+ bomb = 20
+ bio = 50
+ rad = 20
+ fire = -10
+ acid = 50
+ stamina = 20
+ bleed = 15
/obj/item/clothing/head/helmet/outlaw
name = "outlaw's hat"
@@ -328,4 +496,17 @@
item_state = "cowboy"
worn_icon_state = "cowboy_outlaw"
body_parts_covered = HEAD
- armor = list(MELEE = 25, BULLET = 25, LASER = 20, ENERGY = 10, BOMB = 30, BIO = 30, RAD = 20, FIRE = 0, ACID = 40, STAMINA = 25, BLEED = 15)
+ armor_type = /datum/armor/helmet_outlaw
+
+
+/datum/armor/helmet_outlaw
+ melee = 25
+ bullet = 25
+ laser = 20
+ energy = 10
+ bomb = 30
+ bio = 30
+ rad = 20
+ acid = 40
+ stamina = 25
+ bleed = 15
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 7c7d7e996ff89..2e5196aa68e6b 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -32,12 +32,24 @@
icon_state = "captain"
item_state = "that"
flags_inv = 0
- armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 30)
+ armor_type = /datum/armor/hats_caphat
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/captain
dying_key = DYE_REGISTRY_CAP
//Captain: This is no longer space-worthy
+
+/datum/armor/hats_caphat
+ melee = 25
+ bullet = 15
+ laser = 25
+ energy = 30
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 30
+
/obj/item/clothing/head/hats/caphat/parade
name = "captain's parade cap"
desc = "Worn only by Captains with an abundance of class."
@@ -50,11 +62,23 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 15)
+ armor_type = /datum/armor/hats_hopcap
dog_fashion = /datum/dog_fashion/head/hop
dying_key = DYE_REGISTRY_CAP
//Chaplain
+
+/datum/armor/hats_hopcap
+ melee = 25
+ bullet = 15
+ laser = 25
+ energy = 30
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 15
+
/obj/item/clothing/head/chaplain/nun_hood
name = "nun hood"
desc = "Maximum piety in this star system."
@@ -74,13 +98,24 @@
/obj/item/clothing/head/fedora/det_hat
name = "detective's fedora"
desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat."
- armor = list(MELEE = 25, BULLET = 5, LASER = 25, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 50, STAMINA = 25, BLEED = 20)
+ armor_type = /datum/armor/fedora_det_hat
icon_state = "detective"
item_state = "det_hat"
var/candy_cooldown = 0
pocket_storage_component_path = /datum/component/storage/concrete/pockets/small/detective
dog_fashion = /datum/dog_fashion/head/detective
+
+/datum/armor/fedora_det_hat
+ melee = 25
+ bullet = 5
+ laser = 25
+ energy = 30
+ fire = 30
+ acid = 50
+ stamina = 25
+ bleed = 20
+
/obj/item/clothing/head/fedora/det_hat/Initialize(mapload)
. = ..()
new /obj/item/reagent_containers/cup/glass/flask/det(src)
@@ -171,19 +206,44 @@
name = "durathread beret"
desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beretdurathread"
- armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 20, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, STAMINA = 20, BLEED = 45)
+ armor_type = /datum/armor/beret_durathread
//Security
+
+/datum/armor/beret_durathread
+ melee = 15
+ bullet = 25
+ laser = 15
+ energy = 20
+ bomb = 10
+ fire = 30
+ acid = 5
+ stamina = 20
+ bleed = 45
+
/obj/item/clothing/head/hats/hos
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 10, RAD = 0, FIRE = 50, ACID = 60, STAMINA = 30, BLEED = 30)
+ armor_type = /datum/armor/hats_hos
strip_delay = 80
dynamic_hair_suffix = ""
dying_key = DYE_REGISTRY_CAP
+
+/datum/armor/hats_hos
+ melee = 40
+ bullet = 30
+ laser = 25
+ energy = 30
+ bomb = 25
+ bio = 10
+ fire = 50
+ acid = 60
+ stamina = 30
+ bleed = 30
+
/obj/item/clothing/head/hats/hos/syndicate
name = "syndicate cap"
desc = "A black cap fit for a high ranking syndicate officer."
@@ -205,10 +265,22 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60, STAMINA = 30, BLEED = 25)
+ armor_type = /datum/armor/hats_warden
strip_delay = 60
dog_fashion = /datum/dog_fashion/head/warden
+
+/datum/armor/hats_warden
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 25
+ fire = 30
+ acid = 60
+ stamina = 30
+ bleed = 25
+
/obj/item/clothing/head/hats/warden/drill
name = "warden's campaign hat"
desc = "A special armored campaign hat with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
@@ -282,31 +354,79 @@
name = "corporate warden beret"
desc = "A special black beret with the Warden's insignia in the middle. This one is commonly worn by wardens of the corporation."
icon_state = "beret_corporate_warden"
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60, STAMINA = 30, BLEED = 25)
+ armor_type = /datum/armor/beret_corpwarden
strip_delay = 60
+
+/datum/armor/beret_corpwarden
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 25
+ fire = 30
+ acid = 60
+ stamina = 30
+ bleed = 25
+
/obj/item/clothing/head/beret/sec
name = "security beret"
desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection."
icon_state = "beret_badge"
- armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 25)
+ armor_type = /datum/armor/beret_sec
strip_delay = 60
dog_fashion = null
+
+/datum/armor/beret_sec
+ melee = 35
+ bullet = 30
+ laser = 30
+ energy = 40
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 25
+
/obj/item/clothing/head/beret/corpsec
name = "corporate security beret"
desc = "A special black beret for the mundane life of a corporate security officer."
icon_state = "beret_corporate_officer"
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30, BLEED = 25)
+ armor_type = /datum/armor/beret_corpsec
strip_delay = 60
+
+/datum/armor/beret_corpsec
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 25
+ fire = 20
+ acid = 50
+ stamina = 30
+ bleed = 25
+
/obj/item/clothing/head/beret/spacepol
name = "spacepol officer beret"
desc = "A special black beret for the mundane life of a SpacePol officer."
icon_state = "beret_corporate_officer"
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30, BLEED = 25)
+ armor_type = /datum/armor/beret_spacepol
strip_delay = 60
+
+/datum/armor/beret_spacepol
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 25
+ fire = 20
+ acid = 50
+ stamina = 30
+ bleed = 25
+
/obj/item/clothing/head/beret/sec/navyhos
name = "head of security's beret"
desc = "A special beret with the Head of Security's insignia emblazoned on it. A symbol of excellence, a badge of courage, a mark of distinction."
@@ -316,9 +436,21 @@
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "wardenberet"
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 50, STAMINA = 30, BLEED = 25)
+ armor_type = /datum/armor/sec_navywarden
strip_delay = 60
+
+/datum/armor/sec_navywarden
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 10
+ bomb = 25
+ fire = 30
+ acid = 50
+ stamina = 30
+ bleed = 25
+
/obj/item/clothing/head/beret/sec/navyofficer
desc = "A special beret with the security insignia emblazoned on it. For officers with class."
icon_state = "officerberet"
@@ -333,114 +465,260 @@
name = "engineering beret"
desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety."
icon_state = "beret_engineering"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_eng
strip_delay = 60
+
+/datum/armor/beret_eng
+ rad = 10
+ fire = 10
+
/obj/item/clothing/head/beret/atmos
name = "atmospherics beret"
desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing."
icon_state = "beret_atmospherics"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_atmos
strip_delay = 60
+
+/datum/armor/beret_atmos
+ rad = 10
+ fire = 10
+
/obj/item/clothing/head/beret/ce
name = "chief engineer beret"
desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
icon_state = "beret_ce"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 20, FIRE = 30, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_ce
strip_delay = 60
+
+/datum/armor/beret_ce
+ rad = 20
+ fire = 30
+
/obj/item/clothing/head/beret/sci
name = "science beret"
desc = "A purple beret with the science insignia emblazoned on it. It has that authentic burning plasma smell."
icon_state = "beret_sci"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, BIO = 5, RAD = 0, FIRE = 5, ACID = 10, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_sci
strip_delay = 60
+
+/datum/armor/beret_sci
+ bomb = 5
+ bio = 5
+ fire = 5
+ acid = 10
+
/obj/item/clothing/head/beret/supply
name = "supply beret"
desc = "A brown beret with the supply insignia emblazoned on it. You can't help but wonder how much it'd sell for."
icon_state = "beret_supply"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_supply
strip_delay = 60
//Medical
+
+/datum/armor/beret_supply
+ rad = 10
+ fire = 10
+
/obj/item/clothing/head/beret/med
name = "medical beret"
desc = "A white beret with a blue cross finely threaded into it. It has that sterile smell about it."
icon_state = "beret_med"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_med
strip_delay = 60
+
+/datum/armor/beret_med
+ bio = 20
+
/obj/item/clothing/head/beret/cmo
name = "chief medical officer beret"
desc = "A baby blue beret with the insignia of Medistan. It smells very sterile."
icon_state = "beret_cmo"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 30, RAD = 10, FIRE = 0, ACID = 20, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/beret_cmo
strip_delay = 60
//CentCom
+
+/datum/armor/beret_cmo
+ bio = 30
+ rad = 10
+ acid = 20
+
/obj/item/clothing/head/beret/cccaptain
name = "central command captain beret"
desc = "A pure white beret with a Captain insignia of Central Command."
icon_state = "beret_centcom_captain"
- armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80, BLEED = 80)
+ armor_type = /datum/armor/beret_cccaptain
strip_delay = 120
+
+/datum/armor/beret_cccaptain
+ melee = 80
+ bullet = 80
+ laser = 80
+ energy = 80
+ bomb = 80
+ bio = 80
+ rad = 80
+ fire = 80
+ acid = 80
+ stamina = 80
+ bleed = 80
+
/obj/item/clothing/head/beret/ccofficer
name = "central command officer beret"
desc = "A black Central Command Officer beret with matching insignia."
icon_state = "beret_centcom_officer"
- armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80, BLEED = 80)
+ armor_type = /datum/armor/beret_ccofficer
strip_delay = 120
+
+/datum/armor/beret_ccofficer
+ melee = 80
+ bullet = 80
+ laser = 80
+ energy = 80
+ bomb = 80
+ bio = 80
+ rad = 80
+ fire = 80
+ acid = 80
+ stamina = 80
+ bleed = 80
+
/obj/item/clothing/head/beret/ccofficernavy
name = "central command naval officer beret"
desc = "A Navy beret commonly worn by Central Command Naval Officers."
icon_state = "beret_centcom_officer_navy"
- armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80, BLEED = 80)
+ armor_type = /datum/armor/beret_ccofficernavy
strip_delay = 120
//For blueshields, but those aren't in so I renamed them to centcom guards
+
+/datum/armor/beret_ccofficernavy
+ melee = 80
+ bullet = 80
+ laser = 80
+ energy = 80
+ bomb = 80
+ bio = 80
+ rad = 80
+ fire = 80
+ acid = 80
+ stamina = 80
+ bleed = 80
+
/obj/item/clothing/head/beret/ccguard
name = "officer beret"
desc = "A black CentCom guard's beret."
icon_state = "beret_centcom_officer"
- armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30, BLEED = 20)
+ armor_type = /datum/armor/beret_ccguard
strip_delay = 60
+
+/datum/armor/beret_ccguard
+ melee = 40
+ bullet = 20
+ laser = 10
+ energy = 10
+ bomb = 10
+ bio = 5
+ rad = 5
+ fire = 5
+ acid = 30
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/head/beret/ccguardnavy
name = "navy officer beret"
desc = "A navy CentCom guard's beret."
icon_state = "beret_centcom_officer_navy"
- armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30, BLEED = 20)
+ armor_type = /datum/armor/beret_ccguardnavy
strip_delay = 60
+
+/datum/armor/beret_ccguardnavy
+ melee = 40
+ bullet = 20
+ laser = 10
+ energy = 10
+ bomb = 10
+ bio = 5
+ rad = 5
+ fire = 5
+ acid = 30
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/head/beret/sergeant
name = "spacepol sergeant beret"
desc = "A navy SpacePol sergeant's beret."
icon_state = "beret_centcom_officer_navy"
- armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30, BLEED = 20)
+ armor_type = /datum/armor/beret_sergeant
strip_delay = 60
+
+/datum/armor/beret_sergeant
+ melee = 40
+ bullet = 20
+ laser = 10
+ energy = 10
+ bomb = 10
+ bio = 5
+ rad = 5
+ fire = 5
+ acid = 30
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/head/beret/captain
name = "captain beret"
desc = "A lovely blue Captain beret with a gold and white insignia."
icon_state = "beret_captain"
- armor = list(melee = 50, bullet = 30, laser = 20, energy = 30, bomb = 15, bio = 10, rad = 10, fire = 10, acid = 60, stamina = 40, BLEED = 20)
+ armor_type = /datum/armor/beret_captain
strip_delay = 90
//CentCom
+
+/datum/armor/beret_captain
+ melee = 50
+ bullet = 30
+ laser = 20
+ energy = 30
+ bomb = 15
+ bio = 10
+ rad = 10
+ fire = 10
+ acid = 60
+ stamina = 40
+ bleed = 20
+
/obj/item/clothing/head/beret/centcom_formal
name = "\improper CentCom Formal Beret"
desc = "Sometimes, a compromise between fashion and defense needs to be made. Thanks to Nanotrasen's most recent nano-fabric durability enhancements, this time, it's not the case."
icon_state = "beret_badge"
greyscale_colors = "#46b946#f2c42e"
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 90)
+ armor_type = /datum/armor/beret_centcom_formal
strip_delay = 10 SECONDS
#undef DRILL_DEFAULT
#undef DRILL_SHOUTING
#undef DRILL_YELLING
#undef DRILL_CANADIAN
+
+
+/datum/armor/beret_centcom_formal
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 50
+ bomb = 100
+ bio = 100
+ fire = 100
+ acid = 90
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 03dbd6d2df657..8fc44b0c65e68 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -19,7 +19,7 @@
custom_materials = list(/datum/material/iron=1750, /datum/material/glass=400)
flash_protect = 2
tint = 2
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 60, STAMINA = 5)
+ armor_type = /datum/armor/utility_welding
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT
actions_types = list(/datum/action/item_action/toggle)
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT
@@ -27,6 +27,13 @@
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
resistance_flags = FIRE_PROOF
+
+/datum/armor/utility_welding
+ melee = 10
+ fire = 100
+ acid = 60
+ stamina = 5
+
/obj/item/clothing/head/utility/welding/attack_self(mob/user)
weldingvisortoggle(user)
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index ffeb296e16c42..9764d91179082 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -100,9 +100,21 @@
desc = "It's a robust baseball hat in tasteful red colour."
icon_state = "secsoft"
soft_color = "sec"
- armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30, BLEED = 10)
+ armor_type = /datum/armor/soft_sec
strip_delay = 60
+
+/datum/armor/soft_sec
+ melee = 30
+ bullet = 25
+ laser = 25
+ energy = 10
+ bomb = 25
+ fire = 20
+ acid = 50
+ stamina = 30
+ bleed = 10
+
/obj/item/clothing/head/soft/sec/brig_physician
name = "security medic cap"
icon_state = "secmedsoft"
diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm
index d7474119fadd2..c38d794b93217 100644
--- a/code/modules/clothing/head/tinfoilhat.dm
+++ b/code/modules/clothing/head/tinfoilhat.dm
@@ -4,11 +4,17 @@
icon_state = "foilhat"
item_state = null
clothing_flags = EFFECT_HAT | SNUG_FIT
- armor = list(MELEE = 0, BULLET = 0, LASER = -5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = -5, FIRE = 0, ACID = 0, STAMINA = 50)
+ armor_type = /datum/armor/costume_foilhat
equip_delay_other = 140
var/datum/brain_trauma/mild/phobia/conspiracies/paranoia
var/mutable_appearance/psychic_overlay
+
+/datum/armor/costume_foilhat
+ laser = -5
+ rad = -5
+ stamina = 50
+
/obj/item/clothing/head/costume/foilhat/equipped(mob/living/carbon/human/user, slot)
..()
user.sec_hud_set_implants()
@@ -61,7 +67,7 @@
item_state = "tinfoil_envirohelm"
strip_delay = 150
clothing_flags = STOPSPRESSUREDAMAGE | EFFECT_HAT | SNUG_FIT | HEADINTERNALS
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 50)
+ armor_type = /datum/armor/foilhat_plasmaman
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
light_system = MOVABLE_LIGHT
light_range = 4
@@ -78,6 +84,13 @@
///Is the light on?
var/on = FALSE
+
+/datum/armor/foilhat_plasmaman
+ bio = 100
+ fire = 50
+ acid = 50
+ stamina = 50
+
/obj/item/clothing/head/costume/foilhat/plasmaman/attack_self(mob/user)
on = !on
icon_state = "[initial(icon_state)][on ? "-light":""]"
diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm
index 673634303abac..48816303b8c96 100644
--- a/code/modules/clothing/masks/_masks.dm
+++ b/code/modules/clothing/masks/_masks.dm
@@ -62,7 +62,6 @@
if(!mask_adjusted)
icon_state = initial(icon_state)
gas_transfer_coefficient = initial(gas_transfer_coefficient)
- permeability_coefficient = initial(permeability_coefficient)
clothing_flags |= visor_flags
flags_inv |= visor_flags_inv
flags_cover |= visor_flags_cover
@@ -72,7 +71,6 @@
icon_state += "_up"
to_chat(user, "You push \the [src] out of the way.")
gas_transfer_coefficient = null
- permeability_coefficient = null
clothing_flags &= ~visor_flags
flags_inv &= ~visor_flags_inv
flags_cover &= ~visor_flags_cover
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 13522bb18f828..af9f9c2486aa0 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -8,12 +8,16 @@
visor_flags = MASKINTERNALS
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0.1
- permeability_coefficient = 0.5
+ armor_type = /datum/armor/mask_breath
actions_types = list(/datum/action/item_action/adjust)
flags_cover = MASKCOVERSMOUTH
visor_flags_cover = MASKCOVERSMOUTH
resistance_flags = NONE
+
+/datum/armor/mask_breath
+ bio = 50
+
/obj/item/clothing/mask/breath/suicide_act(mob/living/carbon/user)
user.visible_message("[user] is wrapping \the [src]'s tube around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide!")
return OXYLOSS
@@ -34,5 +38,9 @@
name = "medical mask"
icon_state = "medical"
item_state = "m_mask"
- permeability_coefficient = 0.01
+ armor_type = /datum/armor/breath_medical
equip_delay_other = 10
+
+
+/datum/armor/breath_medical
+ bio = 90
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index b77c936274d17..242f21c780d8f 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -7,10 +7,14 @@
w_class = WEIGHT_CLASS_NORMAL
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
+ armor_type = /datum/armor/mask_gas
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
resistance_flags = NONE
+
+/datum/armor/mask_gas
+ bio = 100
+
/obj/item/clothing/mask/gas/atmos/centcom
name = "\improper CentCom gas mask"
desc = "Oooh, gold and green. Fancy! This should help as you sit in your office."
@@ -28,7 +32,7 @@
custom_materials = list(/datum/material/iron=4000, /datum/material/glass=2000)
flash_protect = 2
tint = 2
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 55, STAMINA = 15, BLEED = 5)
+ armor_type = /datum/armor/gas_welding
actions_types = list(/datum/action/item_action/toggle)
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT
flags_cover = MASKCOVERSEYES
@@ -36,6 +40,15 @@
visor_flags_cover = MASKCOVERSEYES
resistance_flags = FIRE_PROOF
+
+/datum/armor/gas_welding
+ melee = 10
+ bio = 100
+ fire = 100
+ acid = 55
+ stamina = 15
+ bleed = 5
+
/obj/item/clothing/mask/gas/welding/attack_self(mob/user)
weldingvisortoggle(user)
@@ -53,7 +66,6 @@
desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply."
icon_state = "plaguedoctor"
item_state = "gas_mask"
- armor = list(MELEE = 0, BULLET = 0, LASER = 2, ENERGY = 2, BOMB = 0, BIO = 75, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
/obj/item/clothing/mask/gas/syndicate
name = "syndicate mask"
diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm
index 349d0c55a9f46..bd1317c8d3d74 100644
--- a/code/modules/clothing/masks/hailer.dm
+++ b/code/modules/clothing/masks/hailer.dm
@@ -34,7 +34,19 @@
aggressiveness = 3
flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDEEYES | HIDEEARS | HIDEHAIR | HIDESNOUT
visor_flags_inv = 0
- armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 30, BLEED = 30)
+ armor_type = /datum/armor/sechailer_swat
+
+
+/datum/armor/sechailer_swat
+ melee = 10
+ bullet = 5
+ laser = 5
+ energy = 5
+ bio = 50
+ fire = 20
+ acid = 40
+ stamina = 30
+ bleed = 30
/obj/item/clothing/mask/gas/sechailer/swat/emagged
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. This one seems to have the safety toggled off..."
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index e0b62d5464f53..1cc8af863b241 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -27,10 +27,13 @@
visor_flags_inv = HIDEFACE|HIDESNOUT
visor_flags_cover = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.9
- permeability_coefficient = 0.01
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 25, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/mask_surgical
actions_types = list(/datum/action/item_action/adjust)
+
+/datum/armor/mask_surgical
+ bio = 100
+
/obj/item/clothing/mask/surgical/attack_self(mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index 8b5d02a26a354..5e0605853a003 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -9,12 +9,16 @@
body_parts_covered = FEET
slot_flags = ITEM_SLOT_FEET
- permeability_coefficient = 0.5
+ armor_type = /datum/armor/clothing_shoes
slowdown = SHOES_SLOWDOWN
strip_delay = 1 SECONDS
var/offset = 0
var/equipped_before_drop = FALSE
+
+/datum/armor/clothing_shoes
+ bio = 50
+
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
if(prob(50))
user.visible_message("[user] begins tying \the [src] up waaay too tightly! It looks like [user.p_theyre()] trying to commit suicide!")
diff --git a/code/modules/clothing/shoes/color.dm b/code/modules/clothing/shoes/color.dm
index 72ff41ae34335..c55ee31bd8d86 100644
--- a/code/modules/clothing/shoes/color.dm
+++ b/code/modules/clothing/shoes/color.dm
@@ -44,7 +44,11 @@
/obj/item/clothing/shoes/sneakers/white
name = "white shoes"
greyscale_colors = "#ffffff#ffffff"
- permeability_coefficient = 0.01
+ armor_type = /datum/armor/sneakers_white
+
+
+/datum/armor/sneakers_white
+ bio = 95
/obj/item/clothing/shoes/sneakers/rainbow
name = "rainbow shoes"
@@ -118,8 +122,14 @@
greyscale_config_worn = null
strip_delay = 5
equip_delay_other = 50
- permeability_coefficient = 0.9
resistance_flags = FIRE_PROOF | ACID_PROOF
+ armor_type = /datum/armor/sneakers_marisa
+
+
+/datum/armor/sneakers_marisa
+ bio = 50
+ fire = 70
+ acid = 30
/obj/item/clothing/shoes/sneakers/cyborg
name = "cyborg boots"
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index a1cecec5fe1f1..2a14b37cddeb1 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -6,7 +6,7 @@
var/magboot_state = "magboots"
var/magpulse = 0
var/slowdown_active = 2
- permeability_coefficient = 0.05
+ armor_type = /datum/armor/shoes_magboots
actions_types = list(/datum/action/item_action/toggle)
strip_delay = 70
equip_delay_other = 70
@@ -23,6 +23,10 @@
. = ..()
REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
+
+/datum/armor/shoes_magboots
+ bio = 90
+
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
set category = "Object"
@@ -81,9 +85,23 @@
icon_state = "advmag0"
magboot_state = "advmag"
slowdown_active = SHOES_SLOWDOWN
- armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50, STAMINA = 30, BLEED = 40)
+ armor_type = /datum/armor/magboots_commando
clothing_flags = NOSLIP
+
+/datum/armor/magboots_commando
+ melee = 40
+ bullet = 30
+ laser = 25
+ energy = 25
+ bomb = 50
+ bio = 30
+ rad = 30
+ fire = 90
+ acid = 50
+ stamina = 30
+ bleed = 40
+
/obj/item/clothing/shoes/magboots/commando/attack_self(mob/user) //Code for the passive no-slip of the commando magboots to always apply, kind of a shit code solution though.
. = ..()
if(magpulse)
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 062fd6927148f..066c515c4bba3 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -6,18 +6,43 @@
item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 30, BLEED = 20)
+ armor_type = /datum/armor/shoes_combat
strip_delay = 40
resistance_flags = NONE
- permeability_coefficient = 0.05 //Thick soles, and covers the ankle
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+
+/datum/armor/shoes_combat
+ melee = 25
+ bullet = 25
+ laser = 25
+ energy = 25
+ bomb = 50
+ bio = 90
+ fire = 70
+ acid = 50
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT boots"
desc = "High speed, no drag combat boots."
- permeability_coefficient = 0.01
clothing_flags = NOSLIP
- armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50, STAMINA = 30, BLEED = 20)
+ armor_type = /datum/armor/combat_swat
+
+
+/datum/armor/combat_swat
+ melee = 40
+ bullet = 30
+ laser = 25
+ energy = 25
+ bomb = 50
+ bio = 100
+ rad = 30
+ fire = 90
+ acid = 50
+ stamina = 30
+ bleed = 20
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain wooden sandals."
@@ -26,9 +51,13 @@
custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 0.5)
strip_delay = 50
equip_delay_other = 50
- permeability_coefficient = 0.9
+ armor_type = /datum/armor/shoes_sandal
strip_delay = 5
+
+/datum/armor/shoes_sandal
+ bio = 10
+
/obj/item/clothing/shoes/sandal/alt
desc = "A pair of shiny black wooden sandals."
name = "black sandals"
@@ -44,16 +73,21 @@
desc = "A pair of yellow rubber boots, designed to prevent slipping on wet surfaces."
name = "galoshes"
icon_state = "galoshes"
- permeability_coefficient = 0.01
clothing_flags = NOSLIP
slowdown = SHOES_SLOWDOWN+1
strip_delay = 30
equip_delay_other = 50
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 75, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/shoes_galoshes
can_be_bloody = FALSE
custom_price = 100
+
+/datum/armor/shoes_galoshes
+ bio = 100
+ fire = 40
+ acid = 75
+
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them."
@@ -127,9 +161,13 @@
strip_delay = 30
equip_delay_other = 50
resistance_flags = NONE
- permeability_coefficient = 0.05 //Thick soles, and covers the ankle
+ armor_type = /datum/armor/shoes_jackboots
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+
+/datum/armor/shoes_jackboots
+ bio = 90
+
/obj/item/clothing/shoes/jackboots_replica // loadout cosmetic variant that's just a normal pair of shoes
name = "replica jackboots"
desc = "A cheap replica of Nanotrasen's Security combat boots. Unlike the real deal. This pair is better fit for everyday wear rather than combat."
@@ -147,13 +185,17 @@
desc = "Boots lined with 'synthetic' animal fur."
icon_state = "winterboots"
item_state = "winterboots"
- permeability_coefficient = 0.15
+ armor_type = /datum/armor/shoes_winterboots
cold_protection = FEET|LEGS
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET|LEGS
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+
+/datum/armor/shoes_winterboots
+ bio = 80
+
/obj/item/clothing/shoes/winterboots/noslip
name = "high-traction winter boots"
desc = "Boots lined with 'synthetic' animal fur and coated with a special freeze resistant anti-slip coating."
@@ -174,11 +216,15 @@
item_state = "jackboots"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- permeability_coefficient = 0.15
+ armor_type = /datum/armor/shoes_workboots
strip_delay = 20
equip_delay_other = 40
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
+
+/datum/armor/shoes_workboots
+ bio = 80
+
/obj/item/clothing/shoes/workboots/mining
name = "mining boots"
desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed."
@@ -219,7 +265,11 @@
item_state = "roman"
strip_delay = 100
equip_delay_other = 100
- permeability_coefficient = 0.9
+ armor_type = /datum/armor/shoes_roman
+
+
+/datum/armor/shoes_roman
+ bio = 10
/obj/item/clothing/shoes/griffin
name = "griffon boots"
@@ -236,13 +286,17 @@
resistance_flags = FIRE_PROOF
pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
actions_types = list(/datum/action/item_action/bhop)
- permeability_coefficient = 0.05
+ armor_type = /datum/armor/shoes_bhop
strip_delay = 30
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
var/jumpspeed = 3
var/recharging_rate = 60 //default 6 seconds between each dash
var/recharging_time = 0 //time until next dash
+
+/datum/armor/shoes_bhop
+ bio = 90
+
/obj/item/clothing/shoes/bhop/ui_action_click(mob/user, action)
if(!isliving(user))
return
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index a01ee6f9b6469..82a0bb5ecd852 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -10,8 +10,7 @@
item_state = "space_helmet"
desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays."
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | HEADINTERNALS
- permeability_coefficient = 0.01
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10, BLEED = 50)
+ armor_type = /datum/armor/helmet_space
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = ""
dynamic_fhair_suffix = ""
@@ -26,6 +25,15 @@
resistance_flags = NONE
dog_fashion = null
+
+/datum/armor/helmet_space
+ bio = 100
+ rad = 50
+ fire = 80
+ acid = 70
+ stamina = 10
+ bleed = 50
+
/obj/item/clothing/suit/space
name = "space suit"
desc = "A suit that protects against low pressure environments. Has a big 13 on the back."
@@ -35,7 +43,6 @@
item_state = "s_suit"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.02
clothing_flags = NOTCONSUMABLE | STOPSPRESSUREDAMAGE | THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(
@@ -43,7 +50,7 @@
/obj/item/tank/internals,
)
slowdown = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10, BLEED = 50)
+ armor_type = /datum/armor/suit_space
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF
@@ -59,6 +66,15 @@
var/thermal_on = FALSE /// Status of the thermal regulator
var/show_hud = TRUE /// If this is FALSE the battery status UI will be disabled. This is used for suits that don't use batteries like the changeling's flesh suit mutation.
+
+/datum/armor/suit_space
+ bio = 100
+ rad = 50
+ fire = 80
+ acid = 70
+ stamina = 10
+ bleed = 50
+
/obj/item/clothing/suit/space/Initialize(mapload)
. = ..()
if(ispath(cell))
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 4b777d0ab7ce4..baa5c3651f7b7 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -4,10 +4,24 @@
icon_state = "chronohelmet"
item_state = "chronohelmet"
slowdown = 1
- armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 80)
+ armor_type = /datum/armor/space_chronos
resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/clothing/suit/space/chronos/suit
+
+/datum/armor/space_chronos
+ melee = 60
+ bullet = 60
+ laser = 60
+ energy = 60
+ bomb = 30
+ bio = 90
+ rad = 90
+ fire = 100
+ acid = 100
+ stamina = 70
+ bleed = 80
+
/obj/item/clothing/head/helmet/space/chronos/dropped()
..()
if(suit)
@@ -19,7 +33,7 @@
icon_state = "chronosuit"
item_state = "chronosuit"
actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle)
- armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 1000, STAMINA = 70, BLEED = 80)
+ armor_type = /datum/armor/space_chronos
resistance_flags = FIRE_PROOF | ACID_PROOF
var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
var/obj/item/clothing/head/helmet/space/chronos/helmet
@@ -31,6 +45,7 @@
var/teleporting = FALSE
var/phase_timer_id
+
/obj/item/clothing/suit/space/chronos/Initialize(mapload)
teleport_now.chronosuit = src
teleport_now.target = src
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index bb3793fd174d5..9f7d6ac1b56fa 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -10,7 +10,7 @@
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
max_integrity = 300
- armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/space_hardsuit
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_range = 4
light_power = 1
@@ -31,6 +31,20 @@
/// If the headlamp is broken, used by lighteater
var/light_broken = FALSE
+
+/datum/armor/space_hardsuit
+ melee = 10
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 75
+ fire = 50
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/Initialize(mapload)
. = ..()
soundloop = new(src, FALSE, TRUE)
@@ -136,7 +150,7 @@
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
max_integrity = 300
- armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/space_hardsuit
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
siemens_coefficient = 0
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
@@ -151,6 +165,20 @@
/// Whether the helmet is on.
var/helmet_on = FALSE
+
+/datum/armor/space_hardsuit
+ melee = 10
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 75
+ fire = 50
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/Initialize(mapload)
if(jetpack && ispath(jetpack))
jetpack = new jetpack(src)
@@ -281,58 +309,128 @@
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 12, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_engine
hardsuit_type = "engineering"
resistance_flags = FIRE_PROOF
+
+/datum/armor/hardsuit_engine
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 12
+ bomb = 10
+ bio = 100
+ rad = 75
+ fire = 100
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/engine
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_engine
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
resistance_flags = FIRE_PROOF
//Atmospherics
+
+/datum/armor/hardsuit_engine
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 75
+ fire = 100
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
name = "atmospherics hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has thermal shielding."
icon_state = "hardsuit0-atmospherics"
item_state = "atmo_helm"
hardsuit_type = "atmospherics"
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/engine_atmos
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+
+/datum/armor/engine_atmos
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 25
+ fire = 100
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/engine/atmos
name = "atmospherics hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding."
icon_state = "hardsuit-atmospherics"
item_state = "atmo_hardsuit"
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/engine_atmos
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
//Chief Engineer's hardsuit
+
+/datum/armor/engine_atmos
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 25
+ fire = 100
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/engine/elite
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "hardsuit0-white"
item_state = "ce_helm"
hardsuit_type = "white"
- armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, STAMINA = 30, BLEED = 70)
+ armor_type = /datum/armor/engine_elite
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+
+/datum/armor/engine_elite
+ melee = 40
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 50
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 90
+ stamina = 30
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/engine/elite
icon_state = "hardsuit-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
- armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, STAMINA = 30, BLEED = 70)
+ armor_type = /datum/armor/engine_elite
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
@@ -340,6 +438,20 @@
cell = /obj/item/stock_parts/cell/super
//Mining hardsuit
+
+/datum/armor/engine_elite
+ melee = 40
+ bullet = 5
+ laser = 10
+ energy = 20
+ bomb = 50
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 90
+ stamina = 30
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/mining
name = "mining hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating for wildlife encounters and dual floodlights."
@@ -349,11 +461,25 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
heat_protection = HEAD
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 40, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_mining
light_range = 7
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator)
high_pressure_multiplier = 0.6
+
+/datum/armor/hardsuit_mining
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 50
+ bio = 100
+ rad = 50
+ fire = 50
+ acid = 75
+ stamina = 40
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/mining/Initialize(mapload)
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -366,12 +492,26 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
supports_variations = DIGITIGRADE_VARIATION
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 40, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_mining
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
high_pressure_multiplier = 0.6
+
+/datum/armor/hardsuit_mining
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 20
+ bomb = 50
+ bio = 100
+ rad = 50
+ fire = 50
+ acid = 75
+ stamina = 40
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/mining/Initialize(mapload)
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -384,7 +524,7 @@
item_state = "death_commando_mask"
hardsuit_type = "exploration"
heat_protection = HEAD
- armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_exploration
light_range = 6
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator)
actions_types = list(
@@ -392,6 +532,20 @@
/datum/action/item_action/toggle_beacon_hud/explorer
)
+
+/datum/armor/hardsuit_exploration
+ melee = 35
+ bullet = 15
+ laser = 20
+ energy = 10
+ bomb = 50
+ bio = 100
+ rad = 50
+ fire = 50
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/exploration/Initialize(mapload)
. = ..()
AddComponent(/datum/component/team_monitor/worn, EXPLORATION_TRACKING, -1)
@@ -409,35 +563,77 @@
desc = "An advanced space-proof hardsuit designed to protect against off-station threats. Despite looking remarkably similar to the mining hardsuit \
Nanotrasen officials note that it is unique in every way and the design has not been copied in any way."
item_state = "exploration_hardsuit"
- armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_exploration
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/exploration
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
//Cybersun Hardsuit
//A kind of side-grade to the explorer suit, sacrificing burn protection for brute. If you can kill the guy inside it, anyways.
+
+/datum/armor/hardsuit_exploration
+ melee = 35
+ bullet = 15
+ laser = 20
+ energy = 10
+ bomb = 50
+ bio = 100
+ rad = 50
+ fire = 50
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/cybersun
name = "Cybersun hardsuit helmet"
desc = "A bulbous red helmet designed for scavenging in hazardous, low pressure environments. Has dual floodlights, and a 360 Degree view."
icon_state = "hardsuit0-cybersun"
item_state = "death_commando_mask"
hardsuit_type = "cybersun"
- armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_cybersun
strip_delay = 600
+
+/datum/armor/hardsuit_cybersun
+ melee = 30
+ bullet = 35
+ laser = 15
+ energy = 15
+ bomb = 60
+ bio = 100
+ rad = 55
+ fire = 30
+ acid = 60
+ stamina = 15
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/cybersun
icon_state = "cybersun"
name = "Cybersun hardsuit"
desc = "A bulky, protective suit designed to protect against the perils facing Cybersun Employed Engineers, Researchers, and more as they head from the safety of \
more stable employment to the dangers of Nanotrasen Controlled Deep Space. Designed to get the job done despite on-site hazards in derelicts, laser armor was \
sacrificed in favor of more effective blunt armor plates and radiation shielding."
- armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_cybersun
hardsuit_type = "cybersun"
item_state = "death_commando_mask"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cybersun
jetpack = /obj/item/tank/jetpack/suit
//Syndicate hardsuit
+
+/datum/armor/hardsuit_cybersun
+ melee = 30
+ bullet = 35
+ laser = 15
+ energy = 15
+ bomb = 60
+ bio = 100
+ rad = 55
+ fire = 30
+ acid = 60
+ stamina = 15
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/syndi
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in EVA mode. Property of Gorlex Marauders."
@@ -445,7 +641,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
hardsuit_type = "syndi"
- armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 55, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_syndi
on = TRUE
var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null
actions_types = list(
@@ -455,6 +651,20 @@
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDEEARS|HIDESNOUT
visor_flags = STOPSPRESSUREDAMAGE | HEADINTERNALS
+
+/datum/armor/hardsuit_syndi
+ melee = 40
+ bullet = 50
+ laser = 30
+ energy = 55
+ bomb = 35
+ bio = 100
+ rad = 50
+ fire = 50
+ acid = 100
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
icon_state = "hardsuit[on]-[hardsuit_type]"
@@ -537,7 +747,7 @@
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = ACID_PROOF
supports_variations = DIGITIGRADE_VARIATION
- armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 55, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_syndi
allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi
jetpack = /obj/item/tank/jetpack/suit
@@ -612,11 +822,25 @@
alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
hardsuit_type = "syndielite"
- armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 80, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 80, BLEED = 70)
+ armor_type = /datum/armor/syndi_elite
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/datum/armor/syndi_elite
+ melee = 60
+ bullet = 60
+ laser = 50
+ energy = 80
+ bomb = 55
+ bio = 100
+ rad = 70
+ fire = 100
+ acid = 100
+ stamina = 80
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode."
@@ -624,13 +848,27 @@
icon_state = "hardsuit0-syndielite"
hardsuit_type = "syndielite"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
- armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 80, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 80, BLEED = 70)
+ armor_type = /datum/armor/syndi_elite
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
cell = /obj/item/stock_parts/cell/bluespace
//The Owl Hardsuit
+
+/datum/armor/syndi_elite
+ melee = 60
+ bullet = 60
+ laser = 50
+ energy = 80
+ bomb = 55
+ bio = 100
+ rad = 70
+ fire = 100
+ acid = 100
+ stamina = 80
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
name = "owl hardsuit helmet"
desc = "A dual-mode advanced helmet designed for any crime-fighting situation. It is in travel mode."
@@ -660,10 +898,24 @@
item_state = "wiz_helm"
hardsuit_type = "wiz"
resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles!
- armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_wizard
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+
+/datum/armor/hardsuit_wizard
+ melee = 40
+ bullet = 40
+ laser = 40
+ energy = 50
+ bomb = 35
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/wizard
icon_state = "hardsuit-wiz"
name = "gem-encrusted hardsuit"
@@ -671,7 +923,7 @@
item_state = "wiz_hardsuit"
w_class = WEIGHT_CLASS_NORMAL
resistance_flags = FIRE_PROOF | ACID_PROOF
- armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_wizard
allowed = list(/obj/item/teleportation_scroll, /obj/item/tank/internals)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
@@ -680,6 +932,20 @@
jetpack = /obj/item/tank/jetpack/suit
slowdown = 0.3
+
+/datum/armor/hardsuit_wizard
+ melee = 40
+ bullet = 40
+ laser = 40
+ energy = 50
+ bomb = 35
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/wizard/ComponentInitialize()
. = ..()
AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100)
@@ -694,9 +960,23 @@
item_state = "medical_helm"
hardsuit_type = "medical"
flash_protect = 0
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_medical
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | SCAN_REAGENTS | HEADINTERNALS
+
+/datum/armor/hardsuit_medical
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 60
+ fire = 60
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/medical
icon_state = "hardsuit-medical"
name = "medical hardsuit"
@@ -704,10 +984,24 @@
item_state = "medical_hardsuit"
supports_variations = DIGITIGRADE_VARIATION
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical)
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_medical
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical
slowdown = 0.5
+
+/datum/armor/hardsuit_medical
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 10
+ bio = 100
+ rad = 60
+ fire = 60
+ acid = 75
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/medical/cmo
name = "chief medical officer's hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort and protects the eyes from intense light."
@@ -725,7 +1019,7 @@
hardsuit_type = "rd"
resistance_flags = ACID_PROOF | FIRE_PROOF
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_rd
var/obj/machinery/doppler_array/integrated/bomb_radar
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | SCAN_REAGENTS | HEADINTERNALS
actions_types = list(
@@ -733,6 +1027,20 @@
/datum/action/item_action/toggle_research_scanner
)
+
+/datum/armor/hardsuit_rd
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 100
+ bio = 100
+ rad = 60
+ fire = 60
+ acid = 80
+ stamina = 30
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize(mapload)
. = ..()
bomb_radar = new /obj/machinery/doppler_array/integrated(src)
@@ -759,10 +1067,24 @@
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure.
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector,
/obj/item/hand_tele, /obj/item/aicard)
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_research_director
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd
cell = /obj/item/stock_parts/cell/super
+
+/datum/armor/hardsuit_research_director
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 15
+ bomb = 100
+ bio = 100
+ rad = 60
+ fire = 60
+ acid = 80
+ stamina = 30
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/research_director/ComponentInitialize()
. = ..()
AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100)
@@ -774,8 +1096,22 @@
icon_state = "hardsuit0-sec"
item_state = "sec_helm"
hardsuit_type = "sec"
- armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_security
+
+
+/datum/armor/hardsuit_security
+ melee = 35
+ bullet = 35
+ laser = 30
+ energy = 50
+ bomb = 40
+ bio = 100
+ rad = 50
+ fire = 75
+ acid = 75
+ stamina = 50
+ bleed = 70
/obj/item/clothing/suit/space/hardsuit/security
icon_state = "hardsuit-sec"
@@ -783,9 +1119,23 @@
desc = "A bulky, armored suit designed to protect security personnel in low pressure environments."
item_state = "sec_hardsuit"
supports_variations = DIGITIGRADE_VARIATION
- armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_security
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security
+
+/datum/armor/hardsuit_security
+ melee = 35
+ bullet = 35
+ laser = 30
+ energy = 50
+ bomb = 40
+ bio = 100
+ rad = 50
+ fire = 75
+ acid = 75
+ stamina = 50
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/security/Initialize(mapload)
. = ..()
allowed = GLOB.security_hardsuit_allowed
@@ -796,32 +1146,74 @@
desc = "A bulky, armored helmet designed to protect security personnel in low pressure environments. This one has markings for the head of security."
icon_state = "hardsuit0-hos"
hardsuit_type = "hos"
- armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/security_hos
+
+/datum/armor/security_hos
+ melee = 35
+ bullet = 35
+ laser = 30
+ energy = 50
+ bomb = 40
+ bio = 100
+ rad = 50
+ fire = 75
+ acid = 75
+ stamina = 50
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/security/head_of_security
icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
supports_variations = DIGITIGRADE_VARIATION
desc = "A bulky, armored suit designed to protect security personnel in low pressure environments. This one has markings for the head of security."
- armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/security_head_of_security
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
jetpack = /obj/item/tank/jetpack/suit
cell = /obj/item/stock_parts/cell/super
//SWAT MKII
+
+/datum/armor/security_head_of_security
+ melee = 35
+ bullet = 35
+ laser = 30
+ energy = 50
+ bomb = 40
+ bio = 100
+ rad = 50
+ fire = 75
+ acid = 75
+ stamina = 50
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/swat
name = "\improper MK.II SWAT Helmet"
icon_state = "swat2helm"
item_state = "swat2helm"
desc = "A tactical SWAT helmet MK.II."
- armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_swat
resistance_flags = FIRE_PROOF | ACID_PROOF
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
actions_types = list()
+
+/datum/armor/hardsuit_swat
+ melee = 40
+ bullet = 50
+ laser = 50
+ energy = 60
+ bomb = 50
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/swat/attack_self() //What the fuck
/obj/item/clothing/suit/space/hardsuit/swat
@@ -829,13 +1221,27 @@
desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available."
icon_state = "swat2"
item_state = "swat2"
- armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_swat
resistance_flags = FIRE_PROOF | ACID_PROOF
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/swat
// SWAT and Captain get EMP Protection
+
+/datum/armor/hardsuit_swat
+ melee = 40
+ bullet = 50
+ laser = 50
+ energy = 60
+ bomb = 50
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/swat/Initialize(mapload)
. = ..()
allowed = GLOB.security_hardsuit_allowed
@@ -861,17 +1267,45 @@
desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding."
icon_state = "hardsuit0-clown"
item_state = "hardsuit0-clown"
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_clown
hardsuit_type = "clown"
+
+/datum/armor/hardsuit_clown
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 20
+ bomb = 10
+ bio = 100
+ rad = 75
+ fire = 60
+ acid = 30
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/clown
name = "cosmohonk hardsuit"
desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it."
icon_state = "hardsuit-clown"
item_state = "clown_hardsuit"
- armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_clown
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown
+
+/datum/armor/hardsuit_clown
+ melee = 30
+ bullet = 5
+ laser = 10
+ energy = 20
+ bomb = 10
+ bio = 100
+ rad = 75
+ fire = 60
+ acid = 30
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, mob/living/equipper, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
if(!..() || !ishuman(M))
return FALSE
@@ -887,17 +1321,31 @@
desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability."
icon_state = "hardsuit0-ancient"
item_state = "anc_helm"
- armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, STAMINA = 30, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_ancient
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/gun/energy/plasmacutter, /obj/item/gun/energy/plasmacutter/adv, /obj/item/gun/energy/laser/retro, /obj/item/gun/energy/laser/retro/old, /obj/item/gun/energy/e_gun/old)
hardsuit_type = "ancient"
resistance_flags = FIRE_PROOF
+
+/datum/armor/hardsuit_ancient
+ melee = 30
+ bullet = 5
+ laser = 5
+ energy = 10
+ bomb = 50
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 75
+ stamina = 30
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/ancient
name = "prototype RIG hardsuit"
desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however."
icon_state = "hardsuit-ancient"
item_state = "anc_hardsuit"
- armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, STAMINA = 30, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_ancient
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/gun/energy/laser/retro, /obj/item/gun/energy/laser/retro/old, /obj/item/gun/energy/e_gun/old)
slowdown = 3
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient
@@ -906,6 +1354,20 @@
/////////////SHIELDED//////////////////////////////////
+
+/datum/armor/hardsuit_ancient
+ melee = 30
+ bullet = 5
+ laser = 5
+ energy = 10
+ bomb = 50
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 75
+ stamina = 30
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/shielded
name = "shielded hardsuit"
desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
@@ -913,7 +1375,7 @@
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos
allowed = null
supports_variations = DIGITIGRADE_VARIATION
- armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_shielded
resistance_flags = FIRE_PROOF | ACID_PROOF
/// How many charges total the shielding has
var/shield_integrity = 60
@@ -924,6 +1386,20 @@
/// The icon for the shield
var/shield_icon = "shield-old"
+
+/datum/armor/hardsuit_shielded
+ melee = 30
+ bullet = 15
+ laser = 30
+ energy = 40
+ bomb = 10
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/shielded/Initialize(mapload)
. = ..()
if(!allowed)
@@ -946,7 +1422,7 @@
worn_icon = 'icons/mob/clothing/suits/ctf.dmi'
icon_state = "standard"
// Adding TRAIT_NODROP is done when the CTF spawner equips people
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) // CTF gear gives no protection outside of the shield
+ armor_type = /datum/armor/none
allowed = null
greyscale_config = /datum/greyscale_config/ctf_standard
greyscale_config_worn = /datum/greyscale_config/ctf_standard_worn
@@ -1013,7 +1489,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
hardsuit_type = "syndi"
- armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/shielded_syndi
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
slowdown = 0
@@ -1025,6 +1501,20 @@
)
jetpack = /obj/item/tank/jetpack/suit
+
+/datum/armor/shielded_syndi
+ melee = 40
+ bullet = 50
+ laser = 30
+ energy = 40
+ bomb = 35
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/shielded/syndi/setup_shielding()
AddComponent(/datum/component/shielded, max_integrity = 60, charge_recovery = 20, recharge_start_delay = 20 SECONDS, charge_increment_delay = 1 SECONDS, shield_icon = "shield-red")
@@ -1041,12 +1531,26 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
hardsuit_type = "syndi"
- armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/shielded_syndi
actions_types = list(
/datum/action/item_action/toggle_helmet_light,
/datum/action/item_action/toggle_beacon_hud
)
+
+/datum/armor/shielded_syndi
+ melee = 40
+ bullet = 50
+ laser = 30
+ energy = 40
+ bomb = 35
+ bio = 100
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi/Initialize(mapload)
. = ..()
if(istype(loc, /obj/item/clothing/suit/space/hardsuit/shielded/syndi))
@@ -1068,13 +1572,27 @@
hardsuit_type = "syndi"
shield_integrity = 80
recharge_delay = 1.5 SECONDS
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY =60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/shielded_swat
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
jetpack = /obj/item/tank/jetpack/suit
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/swat
dog_fashion = /datum/dog_fashion/back/deathsquad
+
+/datum/armor/shielded_swat
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy =60
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/suit/space/hardsuit/shielded/swat/setup_shielding()
AddComponent(/datum/component/shielded, max_integrity = 80, charge_recovery = 20, recharge_start_delay = 1.5 SECONDS, charge_increment_delay = 1 SECONDS, shield_icon = "shield-old")
@@ -1084,11 +1602,25 @@
icon_state = "deathsquad"
item_state = "deathsquad"
hardsuit_type = "syndi"
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/shielded_swat
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
actions_types = list()
+
+/datum/armor/shielded_swat
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 60
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/suit/space/hardsuit/shielded/swat/honk
name = "honk squad spacesuit"
desc = "A hilarious hardsuit favored by HONK squad troopers for use in special pranks."
@@ -1113,13 +1645,27 @@
item_state = "doomguy"
shield_integrity = 20
recharge_delay = 100
- armor = list(MELEE = 135, BULLET = 135, LASER = 135, ENERGY = 135, BOMB = 135, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/shielded_doomguy
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF | LAVA_PROOF
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/doomguy
dog_fashion = /datum/dog_fashion/back/deathsquad
+
+/datum/armor/shielded_doomguy
+ melee = 135
+ bullet = 135
+ laser = 135
+ energy = 135
+ bomb = 135
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/suit/space/hardsuit/shielded/doomguy/setup_shielding()
AddComponent(/datum/component/shielded, max_integrity = 20, charge_recovery = 20, recharge_start_delay = 1 SECONDS, charge_increment_delay = 1 SECONDS, shield_icon = "shield-old")
@@ -1128,9 +1674,23 @@
desc = "A dusty old helmet, somehow capable of resisting the strongest of blows."
icon_state = "doomguy"
item_state = "doomguy"
- armor = list(MELEE = 135, BULLET = 135, LASER = 135, ENERGY = 135, BOMB = 135, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/shielded_doomguy
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
actions_types = list()
#undef HARDSUIT_EMP_BURN
+
+
+/datum/armor/shielded_doomguy
+ melee = 135
+ bullet = 135
+ laser = 135
+ energy = 135
+ bomb = 135
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 439a039cfa676..fa735a1f228ce 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -22,12 +22,26 @@ Contains:
desc = "An advanced tactical space helmet."
icon_state = "deathsquad"
item_state = "deathsquad"
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/hardsuit_deathsquad
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
actions_types = list()
+
+/datum/armor/hardsuit_deathsquad
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 50
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/head/helmet/space/hardsuit/deathsquad/attack_self(mob/user)
return
@@ -37,7 +51,7 @@ Contains:
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/knife/combat)
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/hardsuit_deathsquad
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -46,6 +60,20 @@ Contains:
cell = /obj/item/stock_parts/cell/bluespace
move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg')
+
+/datum/armor/hardsuit_deathsquad
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 50
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/head/helmet/space/beret
name = "CentCom officer's beret"
desc = "An armored beret commonly used by special operations officers. Uses advanced force field technology to protect the head from space."
@@ -56,11 +84,25 @@ Contains:
dynamic_hair_suffix = "+generic"
dynamic_fhair_suffix = "+generic"
flags_inv = 0
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/space_beret
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/datum/armor/space_beret
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 50
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/suit/space/officer
name = "CentCom officer's coat"
desc = "An armored, space-proof coat used in special operations."
@@ -75,12 +117,26 @@ Contains:
flags_inv = 0
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/space_officer
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
//NASA Voidsuit
+
+/datum/armor/space_officer
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 50
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/head/helmet/space/nasavoid
name = "NASA Void Helmet"
desc = "An old, NASA CentCom branch designed, dark red space suit helmet."
@@ -116,12 +172,26 @@ Contains:
worn_icon = 'icons/mob/clothing/head/costume.dmi'
icon_state = "pirate"
item_state = "pirate"
- armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 20)
+ armor_type = /datum/armor/space_pirate
flags_inv = HIDEHAIR
strip_delay = 40
equip_delay_other = 20
flags_cover = HEADCOVERSEYES
+
+/datum/armor/space_pirate
+ melee = 30
+ bullet = 50
+ laser = 30
+ energy = 15
+ bomb = 30
+ bio = 30
+ rad = 30
+ fire = 60
+ acid = 75
+ stamina = 20
+ bleed = 20
+
/obj/item/clothing/head/helmet/space/pirate/bandana
name = "pirate bandana"
icon_state = "bandana"
@@ -137,18 +207,32 @@ Contains:
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/cup/glass/bottle/rum)
slowdown = 0
- armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 20)
+ armor_type = /datum/armor/space_pirate
strip_delay = 40
equip_delay_other = 20
//Emergency Response Team suits
+
+/datum/armor/space_pirate
+ melee = 30
+ bullet = 50
+ laser = 30
+ energy = 15
+ bomb = 30
+ bio = 30
+ rad = 30
+ fire = 60
+ acid = 75
+ stamina = 20
+ bleed = 20
+
/obj/item/clothing/head/helmet/space/hardsuit/ert
name = "emergency response team commander helmet"
desc = "The integrated helmet of an ERT hardsuit, this one has blue highlights."
icon_state = "hardsuit0-ert_commander"
item_state = "hardsuit0-ert_commander"
hardsuit_type = "ert_commander"
- armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 70, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_ert
strip_delay = 130
light_range = 7
resistance_flags = FIRE_PROOF
@@ -160,6 +244,20 @@ Contains:
var/beacon_colour = "#4b48ec"
var/beacon_zdiff_colour = "#0b0a47"
+
+/datum/armor/hardsuit_ert
+ melee = 65
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 50
+ bio = 100
+ rad = 100
+ fire = 80
+ acid = 80
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/ert/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT)
@@ -181,7 +279,7 @@ Contains:
item_state = "ert_command"
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
- armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 70, BLEED = 70)
+ armor_type = /datum/armor/hardsuit_ert
slowdown = 0
strip_delay = 130
resistance_flags = FIRE_PROOF
@@ -194,6 +292,20 @@ Contains:
)
// ERT suit's gets EMP Protection
+
+/datum/armor/hardsuit_ert
+ melee = 65
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 50
+ bio = 100
+ rad = 100
+ fire = 80
+ acid = 80
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/ert/Initialize(mapload)
. = ..()
AddElement(/datum/element/empprotection, EMP_PROTECT_CONTENTS)
@@ -275,7 +387,15 @@ Contains:
icon_state = "space"
item_state = "eva_suit"
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, STAMINA = 0, BLEED = 0, BLEED = 30)
+ armor_type = /datum/armor/space_eva
+
+
+/datum/armor/space_eva
+ bio = 100
+ rad = 20
+ fire = 50
+ acid = 65
+ bleed = 30
/obj/item/clothing/head/helmet/space/eva
name = "EVA helmet"
@@ -283,7 +403,15 @@ Contains:
item_state = "eva_helmet"
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
flash_protect = 0
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, STAMINA = 0, BLEED = 0, BLEED = 30)
+ armor_type = /datum/armor/space_eva
+
+
+/datum/armor/space_eva
+ bio = 100
+ rad = 20
+ fire = 50
+ acid = 65
+ bleed = 30
/obj/item/clothing/head/helmet/space/freedom
name = "eagle helmet"
@@ -292,23 +420,51 @@ Contains:
worn_icon = 'icons/mob/clothing/head/costume.dmi'
icon_state = "griffinhat"
item_state = null
- armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 10, BLEED = 30)
+ armor_type = /datum/armor/space_freedom
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = ACID_PROOF | FIRE_PROOF
+
+/datum/armor/space_freedom
+ melee = 20
+ bullet = 40
+ laser = 30
+ energy = 25
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 80
+ acid = 80
+ stamina = 10
+ bleed = 30
+
/obj/item/clothing/suit/space/freedom
name = "eagle suit"
desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode."
icon_state = "freedom"
item_state = "freedom"
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
- armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 10, BLEED = 30)
+ armor_type = /datum/armor/space_freedom
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = ACID_PROOF | FIRE_PROOF
slowdown = 0
+
+/datum/armor/space_freedom
+ melee = 20
+ bullet = 40
+ laser = 30
+ energy = 25
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 80
+ acid = 80
+ stamina = 10
+ bleed = 30
+
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
name = "paranormal response team helmet"
desc = "A helmet worn by those who deal with paranormal threats for a living."
@@ -384,10 +540,17 @@ Contains:
desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable."
icon_state = "syndicate-helm-orange"
item_state = "syndicate-helm-orange"
- armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 10, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 5)
+ armor_type = /datum/armor/space_fragile
strip_delay = 65
flash_protect = 0
+
+/datum/armor/space_fragile
+ melee = 5
+ bio = 10
+ rad = 10
+ bleed = 5
+
/obj/item/clothing/suit/space/fragile
name = "emergency space suit"
desc = "A bulky, air-tight suit meant to protect the user during emergency situations. It doesn't look very durable."
@@ -395,10 +558,17 @@ Contains:
icon_state = "syndicate-orange"
item_state = "syndicate-orange"
slowdown = 2
- armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 10, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 5)
+ armor_type = /datum/armor/space_fragile
strip_delay = 65
w_class = WEIGHT_CLASS_NORMAL
+
+/datum/armor/space_fragile
+ melee = 5
+ bio = 10
+ rad = 10
+ bleed = 5
+
/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(!torn && prob(50))
to_chat(owner, "\The [src] tears from the damage, breaking the air-tight seal!")
@@ -415,11 +585,25 @@ Contains:
icon_state = "hunter"
item_state = "swat_suit"
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/knife/combat)
- armor = list(melee = 60, bullet = 40, laser = 40, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100, stamina = 70, BLEED = 70)
+ armor_type = /datum/armor/space_hunter
strip_delay = 130
resistance_flags = FIRE_PROOF | ACID_PROOF
cell = /obj/item/stock_parts/cell/hyper
+
+/datum/armor/space_hunter
+ melee = 60
+ bullet = 40
+ laser = 40
+ energy = 50
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/skinsuit
name = "skinsuit helmet"
icon = 'icons/obj/clothing/head/spacehelm.dmi'
@@ -428,8 +612,7 @@ Contains:
item_state = "skinsuit_helmet"
max_integrity = 200
desc = "An airtight helmet meant to protect the wearer during emergency situations."
- permeability_coefficient = 0.01
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/hardsuit_skinsuit
min_cold_protection_temperature = EMERGENCY_HELM_MIN_TEMP_PROTECT
heat_protection = NONE
flash_protect = 0
@@ -439,6 +622,11 @@ Contains:
max_heat_protection_temperature = 100
actions_types = null
+
+/datum/armor/hardsuit_skinsuit
+ bio = 100
+ bleed = 10
+
/obj/item/clothing/head/helmet/space/hardsuit/skinsuit/attack_self(mob/user)
return
@@ -457,14 +645,18 @@ Contains:
clothing_flags = STOPSPRESSUREDAMAGE
species_restricted = null
gas_transfer_coefficient = 0.5
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/hardsuit_skinsuit
allowed = list(/obj/item/flashlight, /obj/item/tank/internals)
min_cold_protection_temperature = EMERGENCY_SUIT_MIN_TEMP_PROTECT
heat_protection = NONE
max_heat_protection_temperature = 100
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/skinsuit
+
+/datum/armor/hardsuit_skinsuit
+ bio = 50
+ bleed = 10
+
/obj/item/clothing/suit/space/hardsuit/skinsuit/attackby(obj/item/I, mob/user, params)
return
@@ -474,4 +666,12 @@ Contains:
icon_state = "hunter"
item_state = "hunter"
resistance_flags = FIRE_PROOF | ACID_PROOF
- armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 20, BLEED = 40)
+ armor_type = /datum/armor/space_hunter
+
+
+/datum/armor/space_hunter
+ melee = 5
+ bullet = 5
+ laser = 5
+ stamina = 20
+ bleed = 40
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 2d709435566f0..519b0d0d1339b 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -5,7 +5,7 @@
name = "EVA plasma envirosuit"
desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like its smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges."
allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/eva_plasmaman
resistance_flags = FIRE_PROOF
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
@@ -14,6 +14,13 @@
var/extinguishes_left = 10
+
+/datum/armor/eva_plasmaman
+ bio = 100
+ fire = 100
+ acid = 75
+ bleed = 10
+
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
. = ..()
. += "There [extinguishes_left == 1 ? "is" : "are"] [extinguishes_left] extinguisher charge\s left in this suit."
@@ -51,7 +58,7 @@
strip_delay = 80
flash_protect = 2
tint = 2
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/space_plasmaman
resistance_flags = FIRE_PROOF
light_system = MOVABLE_LIGHT_DIRECTIONAL
light_range = 4
@@ -69,6 +76,13 @@
flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES
visor_flags_inv = HIDEEYES|HIDEFACE|HIDEFACIALHAIR
+
+/datum/armor/space_plasmaman
+ bio = 100
+ fire = 100
+ acid = 75
+ bleed = 10
+
/obj/item/clothing/head/helmet/space/plasmaman/Initialize(mapload)
. = ..()
visor_toggling()
@@ -244,7 +258,16 @@
name = "security envirosuit helmet"
desc = "A plasmaman containment helmet designed for security officers, protecting them from burning alive, along-side other undesirables."
greyscale_colors = "#9F2A2E#2D2D2D#7D282D"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/plasmaman_security
+
+
+/datum/armor/plasmaman_security
+ melee = 10
+ bio = 100
+ fire = 100
+ acid = 75
+ stamina = 10
+ bleed = 10
/obj/item/clothing/head/helmet/space/plasmaman/security/warden
name = "warden's envirosuit helmet"
@@ -295,9 +318,17 @@
name = "engineering envirosuit helmet"
desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange."
greyscale_colors = "#F0DE00#D75600#F0DE00"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/plasmaman_engineering
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+
+/datum/armor/plasmaman_engineering
+ bio = 100
+ rad = 10
+ fire = 100
+ acid = 75
+ bleed = 10
+
/obj/item/clothing/head/helmet/space/plasmaman/engineering/atmospherics
name = "atmospherics envirosuit helmet"
desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by engineering's blue."
@@ -461,7 +492,16 @@
name = "security Mk.II envirosuit helmet"
desc = "A stylish new iteration upon the original plasmaman containment helmet design for security officers, retaining all the old protections for a new era of fragile law enforcement."
greyscale_colors = "#9F2A2E#2D2D2D"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/mark2_security
+
+
+/datum/armor/mark2_security
+ melee = 10
+ bio = 100
+ fire = 100
+ acid = 75
+ stamina = 10
+ bleed = 10
/obj/item/clothing/head/helmet/space/plasmaman/mark2/security/warden
name = "warden's Mk.II envirosuit helmet"
@@ -512,9 +552,17 @@
name = "engineering Mk.II envirosuit helmet"
desc = "A new iteration upon the classic space-worthy design, painted in classic engineering pigments."
greyscale_colors = "#E8D700#D75600"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/mark2_engineering
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+
+/datum/armor/mark2_engineering
+ bio = 100
+ rad = 10
+ fire = 100
+ acid = 75
+ bleed = 10
+
/obj/item/clothing/head/helmet/space/plasmaman/mark2/engineering/atmospherics
name = "atmospherics Mk.II envirosuit helmet"
desc = "A new iteration upon the classic space-worthy design, painted in classic atmosian pigments."
@@ -713,9 +761,17 @@
name = "engineering protective envirosuit helmet"
desc = "A safer looking re-imagining of the classic space-worthy design, painted in classic engineering pigments."
greyscale_colors = "#E8D700#D75600"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/protective_engineering
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
+
+/datum/armor/protective_engineering
+ bio = 100
+ rad = 10
+ fire = 100
+ acid = 75
+ bleed = 10
+
/obj/item/clothing/head/helmet/space/plasmaman/protective/engineering/atmospherics
name = "atmospherics protective envirosuit helmet"
desc = "A safer looking re-imagining of the classic space-worthy design, painted in classic atmosian pigments."
diff --git a/code/modules/clothing/spacesuits/swat.dm b/code/modules/clothing/spacesuits/swat.dm
index 4982cc85b9156..5dcfdd6ea743d 100644
--- a/code/modules/clothing/spacesuits/swat.dm
+++ b/code/modules/clothing/spacesuits/swat.dm
@@ -13,7 +13,20 @@
/obj/item/tank/internals,
/obj/item/knife/combat
)
- armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 90, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 60)
+ armor_type = /datum/armor/space_swat
strip_delay = 120
resistance_flags = FIRE_PROOF | ACID_PROOF
move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg')
+
+
+/datum/armor/space_swat
+ melee = 40
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 50
+ bio = 90
+ rad = 20
+ fire = 100
+ acid = 100
+ stamina = 60
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 7c45ee8b13829..a6149b5c278dc 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -4,7 +4,21 @@
icon_state = "syndicate"
item_state = "syndicate"
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
- armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, STAMINA = 50, BLEED = 40)
+ armor_type = /datum/armor/space_syndicate
+
+
+/datum/armor/space_syndicate
+ melee = 40
+ bullet = 50
+ laser = 30
+ energy = 40
+ bomb = 30
+ bio = 30
+ rad = 30
+ fire = 80
+ acid = 85
+ stamina = 50
+ bleed = 40
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -13,10 +27,24 @@
desc = "Has a tag on it: Totally not property of an enemy corporation, honest!"
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
- armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, STAMINA = 50, BLEED = 40)
+ armor_type = /datum/armor/space_syndicate
cell = /obj/item/stock_parts/cell/hyper
//Green syndicate space suit
+
+/datum/armor/space_syndicate
+ melee = 40
+ bullet = 50
+ laser = 30
+ energy = 40
+ bomb = 30
+ bio = 30
+ rad = 30
+ fire = 80
+ acid = 85
+ stamina = 50
+ bleed = 40
+
/obj/item/clothing/head/helmet/space/syndicate/green
name = "green space helmet"
icon_state = "syndicate-helm-green"
diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm
index a2411a769ca29..6a2d73dee3218 100644
--- a/code/modules/clothing/suits/_suits.dm
+++ b/code/modules/clothing/suits/_suits.dm
@@ -10,7 +10,7 @@
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman
)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 5)
+ armor_type = /datum/armor/clothing_suit
slot_flags = ITEM_SLOT_OCLOTHING
var/blood_overlay_type = "suit"
var/move_sound = null
@@ -18,6 +18,10 @@
var/mob/listeningTo
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo
+
+/datum/armor/clothing_suit
+ bleed = 5
+
/obj/item/clothing/suit/Initialize(mapload)
. = ..()
setup_shielding()
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index c4738d10b14c4..7ad260ece8ef2 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -11,10 +11,22 @@
equip_delay_other = 40
max_integrity = 250
resistance_flags = NONE
- armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 50)
+ armor_type = /datum/armor/suit_armor
clothing_flags = THICKMATERIAL
slowdown = 0.08
+
+/datum/armor/suit_armor
+ melee = 30
+ bullet = 30
+ laser = 30
+ energy = 40
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 50
+
/obj/item/clothing/suit/armor/Initialize(mapload)
. = ..()
if(!allowed)
@@ -46,30 +58,65 @@
icon_state = "blueshift"
item_state = null
custom_premium_price = 600
- armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 45, BOMB = 30, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 40)
+ armor_type = /datum/armor/vest_blueshirt
slowdown = 0.14
+
+/datum/armor/vest_blueshirt
+ melee = 40
+ bullet = 40
+ laser = 40
+ energy = 45
+ bomb = 30
+ fire = 50
+ acid = 50
+ stamina = 40
+
/obj/item/clothing/suit/armor/vest/corporate
name = "corporate Jacket"
desc = "A Stylish Corporate Jacket which also provides Protection."
icon_state = "secjacket"
item_state = "secjacket"
body_parts_covered = CHEST|ARMS
- armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 45, ACID = 45, STAMINA = 30, BLEED = 20)
+ armor_type = /datum/armor/vest_corporate
slowdown = 0.02
+
+/datum/armor/vest_corporate
+ melee = 25
+ bullet = 25
+ laser = 25
+ energy = 35
+ bomb = 20
+ fire = 45
+ acid = 45
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/suit/armor/hos
name = "armored greatcoat"
desc = "A greatcoat enhanced with a special alloy for some extra protection and style for those with a commanding presence."
icon_state = "hos"
item_state = "greatcoat"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 70, ACID = 90, STAMINA = 40, BLEED = 40)
+ armor_type = /datum/armor/armor_hos
cold_protection = CHEST|GROIN|LEGS|ARMS
heat_protection = CHEST|GROIN|LEGS|ARMS
strip_delay = 80
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
+
+/datum/armor/armor_hos
+ melee = 30
+ bullet = 30
+ laser = 30
+ energy = 40
+ bomb = 25
+ fire = 70
+ acid = 90
+ stamina = 40
+ bleed = 40
+
/obj/item/clothing/suit/armor/hos/trenchcoat
name = "armored trenchcoat"
desc = "A trenchcoat enhanced with a special lightweight kevlar. The epitome of tactical plainclothes."
@@ -115,10 +162,22 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = CHEST|GROIN
- armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 90, STAMINA = 40, BLEED = 60)
+ armor_type = /datum/armor/vest_capcarapace
dog_fashion = null
resistance_flags = FIRE_PROOF
+
+/datum/armor/vest_capcarapace
+ melee = 50
+ bullet = 40
+ laser = 50
+ energy = 60
+ bomb = 25
+ fire = 100
+ acid = 90
+ stamina = 40
+ bleed = 60
+
/obj/item/clothing/suit/armor/vest/capcarapace/syndicate
name = "syndicate captain's vest"
desc = "A sinister looking vest of advanced armor worn over a black and red fireproof jacket. The gold collar and shoulders denote that this belongs to a high ranking syndicate officer."
@@ -137,7 +196,19 @@
icon_state = "capjacket"
item_state = null
body_parts_covered = CHEST|ARMS
- armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 50, BOMB = 55, BIO = 0, RAD = 0, FIRE = 90, ACID = 80, STAMINA = 40, BLEED = 30)
+ armor_type = /datum/armor/capcarapace_jacket
+
+
+/datum/armor/capcarapace_jacket
+ melee = 40
+ bullet = 30
+ laser = 40
+ energy = 50
+ bomb = 55
+ fire = 90
+ acid = 80
+ stamina = 40
+ bleed = 30
/obj/item/clothing/suit/armor/riot
name = "riot suit"
@@ -147,43 +218,89 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 70)
+ armor_type = /datum/armor/armor_riot
blocks_shove_knockdown = TRUE
strip_delay = 80
equip_delay_other = 60
slowdown = 0.15
move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg')
+
+/datum/armor/armor_riot
+ melee = 50
+ bullet = 10
+ laser = 10
+ energy = 15
+ fire = 80
+ acid = 80
+ stamina = 50
+ bleed = 70
+
/obj/item/clothing/suit/armor/bone
name = "bone armor"
desc = "A tribal armor plate, crafted from animal bone."
icon_state = "bonearmor"
item_state = "bonearmor"
blood_overlay_type = "armor"
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 50)
+ armor_type = /datum/armor/armor_bone
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS
slowdown = 0.1
+
+/datum/armor/armor_bone
+ melee = 35
+ bullet = 25
+ laser = 25
+ energy = 30
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 20
+ bleed = 50
+
/obj/item/clothing/suit/armor/bulletproof
name = "bulletproof armor"
desc = "A Type III heavy bulletproof vest that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 40, BLEED = 60)
+ armor_type = /datum/armor/armor_bulletproof
strip_delay = 70
equip_delay_other = 50
+
+/datum/armor/armor_bulletproof
+ melee = 15
+ bullet = 60
+ laser = 10
+ energy = 10
+ bomb = 40
+ fire = 50
+ acid = 50
+ stamina = 40
+ bleed = 60
+
/obj/item/clothing/suit/armor/laserproof
name = "reflector vest"
desc = "A vest that excels in protecting the wearer against energy projectiles, as well as occasionally reflecting them."
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 80, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 40, BLEED = 10)
+ armor_type = /datum/armor/armor_laserproof
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/hit_reflect_chance = 40
+
+/datum/armor/armor_laserproof
+ melee = 10
+ bullet = 10
+ laser = 60
+ energy = 80
+ fire = 100
+ acid = 100
+ stamina = 40
+ bleed = 10
+
/obj/item/clothing/suit/armor/laserproof/IsReflect(def_zone)
if(!(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN))) //If not shot where ablative is covering you, you don't get the reflection bonus!
return 0
@@ -212,18 +329,44 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 3
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 60, BLEED = 70)
+ armor_type = /datum/armor/armor_heavy
move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg')
slowdown = 0.3
+
+/datum/armor/armor_heavy
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 60
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 90
+ acid = 90
+ stamina = 60
+ bleed = 70
+
/obj/item/clothing/suit/armor/tdome
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/armor_tdome
move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg')
+
+/datum/armor/armor_tdome
+ melee = 80
+ bullet = 80
+ laser = 50
+ energy = 60
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 90
+ acid = 90
+
/obj/item/clothing/suit/armor/tdome/red
name = "thunderdome suit"
desc = "Reddish armor."
@@ -238,10 +381,15 @@
/obj/item/clothing/suit/armor/tdome/holosuit
name = "thunderdome suit"
- armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/tdome_holosuit
cold_protection = null
heat_protection = null
+
+/datum/armor/tdome_holosuit
+ melee = 10
+ bullet = 10
+
/obj/item/clothing/suit/armor/tdome/holosuit/red
desc = "Reddish armor."
icon_state = "tdred"
@@ -281,16 +429,40 @@
equip_delay_other = 40
max_integrity = 200
resistance_flags = FLAMMABLE
- armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 50, STAMINA = 30, BLEED = 60)
+ armor_type = /datum/armor/vest_durathread
+
+
+/datum/armor/vest_durathread
+ melee = 20
+ bullet = 40
+ laser = 30
+ energy = 40
+ bomb = 15
+ fire = 40
+ acid = 50
+ stamina = 30
+ bleed = 60
/obj/item/clothing/suit/armor/vest/russian
name = "russian vest"
desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?"
icon_state = "rus_armor"
item_state = "rus_armor"
- armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, STAMINA = 25, BLEED = 20)
+ armor_type = /datum/armor/vest_russian
slowdown = 0.05
+
+/datum/armor/vest_russian
+ melee = 25
+ bullet = 30
+ energy = 15
+ bomb = 10
+ rad = 20
+ fire = 20
+ acid = 50
+ stamina = 25
+ bleed = 20
+
/obj/item/clothing/suit/armor/vest/russian_coat
name = "russian battle coat"
desc = "Used in extremly cold fronts, made out of real bears."
@@ -299,7 +471,21 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
- armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, STAMINA = 30, BLEED = 20)
+ armor_type = /datum/armor/vest_russian_coat
+
+
+/datum/armor/vest_russian_coat
+ melee = 25
+ bullet = 20
+ laser = 20
+ energy = 30
+ bomb = 20
+ bio = 50
+ rad = 20
+ fire = -10
+ acid = 50
+ stamina = 30
+ bleed = 20
/obj/item/clothing/suit/armor/centcom_formal
name = "\improper CentCom formal coat"
@@ -307,7 +493,21 @@
icon_state = "centcom_formal"
item_state = "centcom"
body_parts_covered = CHEST|GROIN|ARMS
- armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, RAD = 10, FIRE = 10, ACID = 60, STAMINA = 40, BLEED = 20)
+ armor_type = /datum/armor/armor_centcom_formal
+
+
+/datum/armor/armor_centcom_formal
+ melee = 35
+ bullet = 40
+ laser = 40
+ energy = 50
+ bomb = 35
+ bio = 10
+ rad = 10
+ fire = 10
+ acid = 60
+ stamina = 40
+ bleed = 20
/obj/item/clothing/suit/armor/centcom_formal/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 3c54e15f9bdeb..0da1c44ecdaf3 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -6,13 +6,20 @@
worn_icon = 'icons/mob/clothing/head/bio.dmi'
icon_state = "bio"
item_state = "bio_hood"
- permeability_coefficient = 0.01
clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 0, BLEED = 5)
+ armor_type = /datum/armor/head_bio_hood
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT
resistance_flags = ACID_PROOF
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+
+/datum/armor/head_bio_hood
+ bio = 100
+ rad = 80
+ fire = 30
+ acid = 100
+ bleed = 5
+
/obj/item/clothing/suit/bio_suit
name = "bio suit"
desc = "A suit that protects against biological contamination."
@@ -22,17 +29,24 @@
item_state = "bio_suit"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 1
allowed = list(/obj/item/tank/internals, /obj/item/pen, /obj/item/flashlight/pen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 0, BLEED = 5)
+ armor_type = /datum/armor/suit_bio_suit
flags_inv = HIDEGLOVES|HIDEJUMPSUIT
strip_delay = 70
equip_delay_other = 70
resistance_flags = ACID_PROOF
+
+/datum/armor/suit_bio_suit
+ bio = 100
+ rad = 80
+ fire = 30
+ acid = 100
+ bleed = 5
+
/obj/item/clothing/suit/bio_suit/ComponentInitialize()
. = ..()
AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 75)
@@ -53,15 +67,43 @@
//Security biosuit, grey with red stripe across the chest
/obj/item/clothing/head/bio_hood/security
- armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 20, BLEED = 10)
+ armor_type = /datum/armor/bio_hood_security
icon_state = "bio_security"
+
+/datum/armor/bio_hood_security
+ melee = 25
+ bullet = 15
+ laser = 25
+ energy = 10
+ bomb = 25
+ bio = 100
+ rad = 80
+ fire = 30
+ acid = 100
+ stamina = 20
+ bleed = 10
+
/obj/item/clothing/suit/bio_suit/security
- armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 20, BLEED = 10)
+ armor_type = /datum/armor/bio_suit_security
icon_state = "bio_security"
//Janitor's biosuit, grey with purple arms
+
+/datum/armor/bio_suit_security
+ melee = 25
+ bullet = 15
+ laser = 25
+ energy = 10
+ bomb = 25
+ bio = 100
+ rad = 80
+ fire = 30
+ acid = 100
+ stamina = 20
+ bleed = 10
+
/obj/item/clothing/head/bio_hood/janitor
icon_state = "bio_janitor"
diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm
index 746af2c1799d4..8ac269fe03a6d 100644
--- a/code/modules/clothing/suits/chaplainsuits.dm
+++ b/code/modules/clothing/suits/chaplainsuits.dm
@@ -9,10 +9,20 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 35)
+ armor_type = /datum/armor/chaplainsuit_armor
strip_delay = 80
equip_delay_other = 60
+
+/datum/armor/chaplainsuit_armor
+ melee = 50
+ bullet = 10
+ laser = 10
+ energy = 10
+ fire = 80
+ acid = 80
+ stamina = 35
+
/obj/item/clothing/suit/hooded/chaplainsuit
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/cup/glass/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
@@ -115,12 +125,22 @@
worn_icon = 'icons/mob/clothing/head/chaplain.dmi'
icon_state = "knight_templar"
item_state = null
- armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 40)
+ armor_type = /datum/armor/helmet_chaplain
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
dog_fashion = null
+
+/datum/armor/helmet_chaplain
+ melee = 50
+ bullet = 10
+ laser = 10
+ energy = 10
+ fire = 80
+ acid = 80
+ stamina = 40
+
/obj/item/clothing/suit/chaplainsuit/armor/templar
name = "crusader armour"
desc = "God wills it!"
@@ -138,7 +158,19 @@
icon_state = "crusader"
w_class = WEIGHT_CLASS_NORMAL
flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 50, BLEED = 60)
+ armor_type = /datum/armor/plate_crusader
+
+
+/datum/armor/plate_crusader
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 40
+ bomb = 60
+ fire = 60
+ acid = 60
+ stamina = 50
+ bleed = 60
/obj/item/clothing/head/helmet/plate/crusader/blue
icon_state = "crusader-blue"
@@ -156,10 +188,24 @@
worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
item_state = null
flags_1 = 0
- armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 50, BOMB = 70, BIO = 50, RAD = 50, FIRE = 60, ACID = 60, STAMINA = 60, BLEED = 60) //religion protects you from disease and radiation, honk.
+ armor_type = /datum/armor/crusader_prophet
worn_x_dimension = 64
worn_y_dimension = 64
+
+/datum/armor/crusader_prophet
+ melee = 60
+ bullet = 60
+ laser = 60
+ energy = 50
+ bomb = 70
+ bio = 50
+ rad = 50
+ fire = 60
+ acid = 60
+ stamina = 60
+ bleed = 60
+
/obj/item/clothing/head/helmet/plate/crusader/prophet/red
icon_state = "prophet-red"
item_state = null
@@ -220,7 +266,18 @@
w_class = WEIGHT_CLASS_BULKY
slowdown = 2.0 //gotta pretend we're balanced.
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 50)
+ armor_type = /datum/armor/armor_crusader
+
+
+/datum/armor/armor_crusader
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 40
+ bomb = 60
+ fire = 60
+ acid = 60
+ stamina = 50
/obj/item/clothing/suit/chaplainsuit/armor/crusader/red
icon_state = "crusader-red"
@@ -282,13 +339,18 @@
desc = "A pair of leather gloves in poor condition."
icon_state = "graverobber-gloves"
item_state = "graverobber-gloves"
- permeability_coefficient = 0.9
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = NONE
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 20, STAMINA = 0)
+ armor_type = /datum/armor/gloves_graverobber_gloves
+
+
+/datum/armor/gloves_graverobber_gloves
+ bio = 10
+ fire = 30
+ acid = 20
/obj/item/clothing/under/rank/civilian/graverobber_under
name = "grave robber uniform"
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index cd1322e2543bb..e77cdd5c8827e 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -63,26 +63,50 @@
icon_state = "goliath_cloak"
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/spear/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/knife/combat/bone, /obj/item/knife/combat/survival)
- armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30, BLEED = 20) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
+ armor_type = /datum/armor/cloak_goliath
hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath
body_parts_covered = CHEST|GROIN|ARMS
resistance_flags = FIRE_PROOF
+
+/datum/armor/cloak_goliath
+ melee = 50
+ bullet = 10
+ laser = 25
+ energy = 10
+ bomb = 25
+ fire = 60
+ acid = 60
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/head/hooded/cloakhood/goliath
name = "goliath cloak hood"
icon_state = "golhood"
desc = "A protective & concealing hood."
- armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30, BLEED = 30)
+ armor_type = /datum/armor/cloakhood_goliath
flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR
transparent_protection = HIDEMASK
resistance_flags = FIRE_PROOF
+
+/datum/armor/cloakhood_goliath
+ melee = 50
+ bullet = 10
+ laser = 25
+ energy = 10
+ bomb = 25
+ fire = 60
+ acid = 60
+ stamina = 30
+ bleed = 30
+
/obj/item/clothing/suit/hooded/cloak/drake
name = "drake armour"
icon_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake."
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear)
- armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 30, BLEED = 50)
+ armor_type = /datum/armor/cloak_drake
hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -91,21 +115,49 @@
transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES
high_pressure_multiplier = 0.4
+
+/datum/armor/cloak_drake
+ melee = 70
+ bullet = 30
+ laser = 50
+ energy = 40
+ bomb = 70
+ bio = 60
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 30
+ bleed = 50
+
/obj/item/clothing/head/hooded/cloakhood/drake
name = "drake helm"
icon_state = "dragon"
desc = "The skull of a dragon."
- armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 30, BLEED = 50)
+ armor_type = /datum/armor/cloakhood_drake
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
high_pressure_multiplier = 0.4
+
+/datum/armor/cloakhood_drake
+ melee = 70
+ bullet = 30
+ laser = 50
+ energy = 40
+ bomb = 70
+ bio = 60
+ rad = 50
+ fire = 100
+ acid = 100
+ stamina = 30
+ bleed = 50
+
/obj/item/clothing/suit/hooded/cloak/bone
name = "Heavy bone armor"
icon_state = "hbonearmor"
desc = "A tribal armor plate, crafted from animal bone. A heavier variation of standard bone armor."
- armor = list(MELEE = 40, BULLET = 25, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 70)
+ armor_type = /datum/armor/cloak_bone
hoodtype = /obj/item/clothing/head/hooded/cloakhood/bone
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS
@@ -113,17 +165,41 @@
resistance_flags = NONE
transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES
+
+/datum/armor/cloak_bone
+ melee = 40
+ bullet = 25
+ laser = 30
+ energy = 30
+ bomb = 30
+ fire = 50
+ acid = 50
+ stamina = 20
+ bleed = 70
+
/obj/item/clothing/head/hooded/cloakhood/bone
name = "bone helmet"
icon_state = "hskull"
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
- armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 50)
+ armor_type = /datum/armor/cloakhood_bone
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
resistance_flags = NONE
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES
+
+/datum/armor/cloakhood_bone
+ melee = 35
+ bullet = 25
+ laser = 25
+ energy = 10
+ bomb = 25
+ fire = 50
+ acid = 50
+ stamina = 20
+ bleed = 50
+
/obj/item/clothing/neck/cloak/chap/bishop
name = "bishop's cloak"
desc = "Become the space pope."
diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm
index ad6e2eb08d999..f630a300c286d 100644
--- a/code/modules/clothing/suits/costume.dm
+++ b/code/modules/clothing/suits/costume.dm
@@ -216,10 +216,22 @@
desc = "You broke the rules of the duel, and drew your gun before High Noon. This poncho will rest on your shoulders eternally, just like your shame."
icon_state = "ponchoshame_alt"
item_state = "ponchoshame_alt"
- armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 20, BOMB = 30, BIO = 30, RAD = 20, FIRE = 0, ACID = 30, STAMINA = 35)
+ armor_type = /datum/armor/ponchoshame_outlaw
body_parts_covered = CHEST|GROIN
allowed = list(/obj/item/gun/ballistic/shotgun/lever_action, /obj/item/gun/ballistic/rifle/leveraction, /obj/item/gun/ballistic/revolver)
+
+/datum/armor/ponchoshame_outlaw
+ melee = 25
+ bullet = 25
+ laser = 25
+ energy = 20
+ bomb = 30
+ bio = 30
+ rad = 20
+ acid = 30
+ stamina = 35
+
/obj/item/clothing/suit/costume/whitedress
name = "white dress"
desc = "A fancy white dress."
@@ -249,7 +261,7 @@
icon_state = "carp_suit"
item_state = "space_suit_syndicate"
slowdown = 0 //Space carp magic, never stop believing
- armor = list(MELEE = 20, BULLET = 10, LASER = 20, ENERGY = 20, BOMB = 30, BIO = 100, RAD = 75, FIRE = 60, ACID = 75, STAMINA = 40)
+ armor_type = /datum/armor/carp_costume_spaceproof
allowed = list(
/obj/item/tank/internals,
/obj/item/pneumatic_cannon/speargun,
@@ -267,6 +279,19 @@
hoodtype = /obj/item/clothing/head/hooded/carp_hood/spaceproof
resistance_flags = NONE
+
+/datum/armor/carp_costume_spaceproof
+ melee = 20
+ bullet = 10
+ laser = 20
+ energy = 20
+ bomb = 30
+ bio = 100
+ rad = 75
+ fire = 60
+ acid = 75
+ stamina = 40
+
/obj/item/clothing/suit/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts?
name = "corgi costume"
desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
@@ -349,7 +374,8 @@
desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice."
icon = 'icons/obj/clothing/clockwork_garb.dmi'
icon_state = "clockwork_cuirass_old"
- armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 20, STAMINA = 30)
+ armor_type = /datum/armor/costume_bronze
+
/obj/item/clothing/suit/costume/joker
name = "comedian coat"
diff --git a/code/modules/clothing/suits/donator.dm b/code/modules/clothing/suits/donator.dm
index 1a92a549c9b60..35a12e94ffb84 100644
--- a/code/modules/clothing/suits/donator.dm
+++ b/code/modules/clothing/suits/donator.dm
@@ -37,6 +37,10 @@
icon_state = "softshell"
item_state = "softshell"
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/radio)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 30, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/toggle_softshell
toggle_noun = "zipper"
body_parts_covered = CHEST|GROIN|ARMS
+
+
+/datum/armor/toggle_softshell
+ bio = 30
diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm
index d321b2295d91d..f5af5c617cbf7 100644
--- a/code/modules/clothing/suits/hoodies.dm
+++ b/code/modules/clothing/suits/hoodies.dm
@@ -8,10 +8,14 @@
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/hooded_hoodie
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/hoodie
+
+/datum/armor/hooded_hoodie
+ bio = 10
+
/obj/item/clothing/head/hooded/hoodie
name = "white hoodie hood"
desc = "A hood attached to your hoodie, simple as."
@@ -127,11 +131,31 @@
name = "durathread hoodie"
desc = "A hoodie made from durathread, its resilient fibres provide some protection to the wearer."
color = "#8291a1"
- armor = list(MELEE = 15, BULLET = 25, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, STAMINA = 30)
+ armor_type = /datum/armor/hoodie_durathread
hoodtype = /obj/item/clothing/head/hooded/hoodie/durathread
+
+/datum/armor/hoodie_durathread
+ melee = 15
+ bullet = 25
+ laser = 10
+ fire = 40
+ acid = 10
+ bomb = 5
+ stamina = 30
+
/obj/item/clothing/head/hooded/hoodie/durathread
name = "durathread hoodie hood"
desc = "A duratread hood attached to your hoodie, robust as."
- armor = list(MELEE = 5, BULLET = 5, LASER = 5, FIRE = 20, ACID = 5, BOMB = 5, STAMINA = 15)
+ armor_type = /datum/armor/hoodie_durathread
color = "#8291a1"
+
+
+/datum/armor/hoodie_durathread
+ melee = 5
+ bullet = 5
+ laser = 5
+ fire = 20
+ acid = 5
+ bomb = 5
+ stamina = 15
diff --git a/code/modules/clothing/suits/jacket.dm b/code/modules/clothing/suits/jacket.dm
index 63709a5f038af..433c3956c7fca 100644
--- a/code/modules/clothing/suits/jacket.dm
+++ b/code/modules/clothing/suits/jacket.dm
@@ -41,7 +41,11 @@
desc = "A thick jacket with a rubbery, water-resistant shell."
icon_state = "pufferjacket"
item_state = "hostrench"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/jacket_puffer
+
+
+/datum/armor/jacket_puffer
+ bio = 50
/obj/item/clothing/suit/jacket/puffer/vest
name = "puffer vest"
@@ -50,7 +54,11 @@
item_state = "armor"
body_parts_covered = CHEST|GROIN
cold_protection = CHEST|GROIN
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 30, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/puffer_vest
+
+
+/datum/armor/puffer_vest
+ bio = 30
/obj/item/clothing/suit/jacket/miljacket
name = "military jacket"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 176f65d639c5e..c254a683cb19e 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -46,7 +46,7 @@
icon = 'icons/obj/clothing/suits/jacket.dmi'
worn_icon = 'icons/mob/clothing/suits/jacket.dmi'
gas_transfer_coefficient = 0.9
- permeability_coefficient = 0.5
+ armor_type = /datum/armor/toggle_chef
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(
/obj/item/kitchen,
@@ -55,6 +55,10 @@
toggle_noun = "sleeves"
//Cook
+
+/datum/armor/toggle_chef
+ bio = 50
+
/obj/item/clothing/suit/apron/chef
name = "cook's apron"
desc = "A basic, dull, white chef's apron."
@@ -75,7 +79,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = CHEST|GROIN|ARMS
- armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 40, BLEED = 30)
+ armor_type = /datum/armor/jacket_det_suit
cold_protection = CHEST|GROIN|ARMS
heat_protection = CHEST|GROIN|ARMS
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
@@ -85,6 +89,16 @@
/obj/item/clothing/accessory/holster/detective,
) //Trench coats are a little more apt at carrying larger objects.
+
+/datum/armor/jacket_det_suit
+ melee = 25
+ bullet = 10
+ laser = 25
+ energy = 10
+ acid = 45
+ stamina = 40
+ bleed = 30
+
/obj/item/clothing/suit/jacket/det_suit/Initialize(mapload)
. = ..()
allowed = GLOB.detective_vest_allowed
@@ -110,9 +124,18 @@
icon_state = "brig_phys_vest"
item_state = "sec_helm"//looks kinda similar, I guess
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/storage/firstaid, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/cup/bottle, /obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/police/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 20)
+ armor_type = /datum/armor/hazardvest_brig_physician
//Engineering
+
+/datum/armor/hazardvest_brig_physician
+ melee = 10
+ bio = 10
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 20
+
/obj/item/clothing/suit/hazardvest
name = "hazard vest"
desc = "A high-visibility vest used in work zones."
@@ -232,12 +255,22 @@
/obj/item/tank/internals,
/obj/item/melee/curator_whip
)
- armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 30, BLEED = 10)
+ armor_type = /datum/armor/jacket_curator
cold_protection = CHEST|ARMS
heat_protection = CHEST|ARMS
//Roboticist
+
+/datum/armor/jacket_curator
+ melee = 25
+ bullet = 10
+ laser = 25
+ energy = 10
+ acid = 45
+ stamina = 30
+ bleed = 10
+
/obj/item/clothing/suit/hooded/techpriest
name = "techpriest robes"
desc = "For those who REALLY love their toasters."
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 568d914a6dc66..314ac9c15572b 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -28,9 +28,16 @@
/obj/item/tank/internals/emergency_oxygen,
/obj/item/tank/internals/plasmaman
)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 5)
+ armor_type = /datum/armor/toggle_labcoat
species_exception = list(/datum/species/golem)
+
+/datum/armor/toggle_labcoat
+ bio = 50
+ fire = 50
+ acid = 50
+ bleed = 5
+
/obj/item/clothing/suit/toggle/labcoat/cmo
name = "chief medical officer's labcoat"
desc = "Bluer than the standard model. Issued to Chief Medical Officers, keeping them visible at all times among the sea of the wounded and other doctors."
@@ -47,7 +54,16 @@
name = "security medic's labcoat"
icon_state = "labcoat_sec"
item_state = "labcoat_sec"
- armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50, stamina = 30, BLEED = 10)
+ armor_type = /datum/armor/labcoat_brig_physician
+
+
+/datum/armor/labcoat_brig_physician
+ melee = 10
+ bio = 10
+ fire = 50
+ acid = 50
+ stamina = 30
+ bleed = 10
/obj/item/clothing/suit/toggle/labcoat/mad
name = "\proper The Mad's labcoat"
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index 1dcab2ae4dc3d..3774bcd3c302d 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -33,7 +33,7 @@
icon_state = "reactiveoff"
item_state = "reactiveoff"
blood_overlay_type = "armor"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/armor_reactive
actions_types = list(/datum/action/item_action/toggle)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
hit_reaction_chance = 50
@@ -51,6 +51,12 @@
COOLDOWN_DECLARE(reactivearmor_cooldown)
pocket_storage_component_path = FALSE
+
+/datum/armor/armor_reactive
+ fire = 100
+ acid = 100
+ bleed = 10
+
/obj/item/clothing/suit/armor/reactive/attack_self(mob/user)
active = !(active)
if(active)
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index f89989b87caa1..06bf83f00d63d 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -21,7 +21,6 @@
item_state = "ro_suit"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.9
- permeability_coefficient = 0.5
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(
/obj/item/flashlight,
@@ -32,7 +31,7 @@
/obj/item/powertool/jaws_of_life
)
slowdown = 1
- armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, STAMINA = 10, BLEED = 25)
+ armor_type = /datum/armor/utility_fire
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -43,6 +42,20 @@
equip_delay_other = 60
resistance_flags = FIRE_PROOF
+
+/datum/armor/utility_fire
+ melee = 15
+ bullet = 5
+ laser = 20
+ energy = 10
+ bomb = 20
+ bio = 50
+ rad = 20
+ fire = 100
+ acid = 50
+ stamina = 10
+ bleed = 25
+
/obj/item/clothing/suit/utility/fire/firefighter
icon_state = "firesuit"
item_state = "firefighter"
@@ -70,7 +83,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
clothing_flags = THICKMATERIAL | SNUG_FIT
- armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10, BLEED = 25)
+ armor_type = /datum/armor/utility_bomb_hood
flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
dynamic_hair_suffix = ""
dynamic_fhair_suffix = ""
@@ -84,6 +97,17 @@
resistance_flags = NONE
+
+/datum/armor/utility_bomb_hood
+ melee = 20
+ laser = 20
+ energy = 10
+ bomb = 100
+ fire = 80
+ acid = 50
+ stamina = 10
+ bleed = 25
+
/obj/item/clothing/suit/utility/bomb_suit
name = "bomb suit"
desc = "A suit designed for safety when handling explosives."
@@ -91,11 +115,10 @@
item_state = "bombsuit"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10, BLEED = 25)
+ armor_type = /datum/armor/utility_bomb_suit
flags_inv = HIDEJUMPSUIT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
@@ -105,6 +128,18 @@
equip_delay_other = 70
resistance_flags = NONE
+
+/datum/armor/utility_bomb_suit
+ melee = 20
+ laser = 20
+ energy = 10
+ bomb = 100
+ bio = 50
+ fire = 80
+ acid = 50
+ stamina = 10
+ bleed = 25
+
/obj/item/clothing/head/utility/bomb_hood/security
icon_state = "bombsuit_sec"
item_state = "bombsuit_sec"
@@ -133,12 +168,21 @@
desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'"
clothing_flags = THICKMATERIAL | SNUG_FIT
flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 15)
+ armor_type = /datum/armor/utility_radiation
strip_delay = 60
equip_delay_other = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
rad_flags = RAD_PROTECT_CONTENTS
+
+/datum/armor/utility_radiation
+ bio = 60
+ rad = 100
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 15
+
/obj/item/clothing/suit/utility/radiation
name = "radiation suit"
desc = "A suit that protects against radiation. The label reads, 'Made with lead. Please do not consume insulation.'"
@@ -146,17 +190,25 @@
item_state = "rad_suit"
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.9
- permeability_coefficient = 0.5
clothing_flags = THICKMATERIAL
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/geiger_counter)
slowdown = 1.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 15)
+ armor_type = /datum/armor/utility_radiation
strip_delay = 60
equip_delay_other = 60
flags_inv = HIDEJUMPSUIT
rad_flags = RAD_PROTECT_CONTENTS
+
+/datum/armor/utility_radiation
+ bio = 60
+ rad = 100
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 15
+
/obj/item/clothing/suit/utility/radiation/ComponentInitialize()
. = ..()
AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100)
diff --git a/code/modules/clothing/suits/wetfloor.dm b/code/modules/clothing/suits/wetfloor.dm
index 3e06527657ac5..3ec8848270fc3 100644
--- a/code/modules/clothing/suits/wetfloor.dm
+++ b/code/modules/clothing/suits/wetfloor.dm
@@ -14,5 +14,9 @@
body_parts_covered = CHEST|GROIN
attack_verb_continuous = list("warns", "cautions", "smashes")
attack_verb_simple = list("warn", "caution", "smash")
- armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/suit_caution
pocket_storage_component_path = null
+
+
+/datum/armor/suit_caution
+ melee = 5
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 5423c6961e8fa..f8be2f50f300b 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -10,7 +10,7 @@
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/hooded_wintercoat
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals/emergency_oxygen,
@@ -20,6 +20,10 @@
/obj/item/lighter
)
+
+/datum/armor/hooded_wintercoat
+ bio = 10
+
/obj/item/clothing/head/hooded/winterhood
name = "winter hood"
desc = "A hood attached to a heavy winter jacket."
@@ -44,9 +48,19 @@
name = "captain's winter coat"
icon_state = "coatcaptain"
item_state = "coatcaptain"
- armor = list(MELEE = 25, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 20)
+ armor_type = /datum/armor/wintercoat_captain
hoodtype = /obj/item/clothing/head/hooded/winterhood/captain
+
+/datum/armor/wintercoat_captain
+ melee = 25
+ bullet = 30
+ laser = 30
+ energy = 10
+ bomb = 25
+ acid = 50
+ stamina = 20
+
/obj/item/clothing/suit/hooded/wintercoat/captain/Initialize(mapload)
. = ..()
allowed = GLOB.security_wintercoat_allowed
@@ -60,17 +74,39 @@
icon_state = "coatsecurity"
item_state = "coatsecurity"
hoodtype = /obj/item/clothing/head/hooded/winterhood/security
- armor = list(MELEE = 15, BULLET = 15, LASER = 40, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 45, STAMINA = 40)
+ armor_type = /datum/armor/wintercoat_security
slowdown = 0.04
+
+/datum/armor/wintercoat_security
+ melee = 15
+ bullet = 15
+ laser = 40
+ energy = 50
+ bomb = 25
+ fire = 60
+ acid = 45
+ stamina = 40
+
/obj/item/clothing/suit/hooded/wintercoat/security/Initialize(mapload)
. = ..()
allowed = GLOB.security_wintercoat_allowed
/obj/item/clothing/head/hooded/winterhood/security
- armor = list(MELEE = 15, BULLET = 15, LASER = 40, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 45, STAMINA = 40)
+ armor_type = /datum/armor/winterhood_security
icon_state = "winterhood_security"
+
+/datum/armor/winterhood_security
+ melee = 15
+ bullet = 15
+ laser = 40
+ energy = 50
+ bomb = 25
+ fire = 60
+ acid = 45
+ stamina = 40
+
/obj/item/clothing/suit/hooded/wintercoat/detective
name = "detective winter coat"
icon_state = "coatdetective"
@@ -91,13 +127,31 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter
)
- armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 40)
+ armor_type = /datum/armor/wintercoat_detective
heat_protection = CHEST|GROIN|ARMS
hoodtype = /obj/item/clothing/head/hooded/winterhood/detective
+
+/datum/armor/wintercoat_detective
+ melee = 25
+ bullet = 10
+ laser = 25
+ energy = 10
+ acid = 45
+ stamina = 40
+
/obj/item/clothing/head/hooded/winterhood/detective
icon_state = "winterhood_detective"
- armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 30)
+ armor_type = /datum/armor/winterhood_detective
+
+
+/datum/armor/winterhood_detective
+ melee = 25
+ bullet = 10
+ laser = 25
+ energy = 20
+ acid = 45
+ stamina = 30
/obj/item/clothing/suit/hooded/wintercoat/brigphys
name = "brig physician winter coat"
@@ -127,12 +181,30 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter
)
- armor = list(MELEE = 10, BULLET = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20)
+ armor_type = /datum/armor/wintercoat_brigphys
hoodtype = /obj/item/clothing/head/hooded/winterhood/brigphys
+
+/datum/armor/wintercoat_brigphys
+ melee = 10
+ laser = 10
+ bio = 20
+ fire = 50
+ acid = 50
+ stamina = 20
+
/obj/item/clothing/head/hooded/winterhood/brigphys
icon_state = "winterhood_brigphys"
- armor = list(MELEE = 10, BULLET = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20)
+ armor_type = /datum/armor/winterhood_brigphys
+
+
+/datum/armor/winterhood_brigphys
+ melee = 10
+ laser = 10
+ bio = 20
+ fire = 50
+ acid = 50
+ stamina = 20
/obj/item/clothing/suit/hooded/wintercoat/medical
name = "medical winter coat"
@@ -163,9 +235,14 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter
)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 0)
+ armor_type = /datum/armor/wintercoat_medical
hoodtype = /obj/item/clothing/head/hooded/winterhood/medical
+
+/datum/armor/wintercoat_medical
+ bio = 50
+ acid = 45
+
/obj/item/clothing/head/hooded/winterhood/medical
icon_state = "winterhood_medical"
@@ -198,12 +275,21 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter
)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 80, RAD = 0, FIRE = 0, ACID = 15, STAMINA = 0)
+ armor_type = /datum/armor/wintercoat_virologist
hoodtype = /obj/item/clothing/head/hooded/winterhood/virologist
+
+/datum/armor/wintercoat_virologist
+ bio = 80
+ acid = 15
+
/obj/item/clothing/head/hooded/winterhood/virologist
icon_state = "winterhood_viro"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/winterhood_virologist
+
+
+/datum/armor/winterhood_virologist
+ bio = 50
/obj/item/clothing/suit/hooded/wintercoat/chemist
name = "chemist winter coat"
@@ -235,10 +321,16 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter
)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 40, STAMINA = 0)
+ armor_type = /datum/armor/wintercoat_chemist
resistance_flags = FIRE_PROOF | ACID_PROOF
hoodtype = /obj/item/clothing/head/hooded/winterhood/chemist
+
+/datum/armor/wintercoat_chemist
+ bomb = 15
+ fire = 40
+ acid = 40
+
/obj/item/clothing/head/hooded/winterhood/chemist
icon_state = "winterhood_chem"
resistance_flags = FIRE_PROOF | ACID_PROOF
@@ -276,9 +368,15 @@
/obj/item/storage/fancy/cigarettes,
/obj/item/lighter
)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 30, FIRE = 0, ACID = 45, STAMINA = 0)
+ armor_type = /datum/armor/wintercoat_geneticist
hoodtype = /obj/item/clothing/head/hooded/winterhood/geneticist
+
+/datum/armor/wintercoat_geneticist
+ bio = 20
+ rad = 30
+ acid = 45
+
/obj/item/clothing/head/hooded/winterhood/geneticist
icon_state = "winterhood_gene"
@@ -287,9 +385,13 @@
icon_state = "coatscience"
item_state = "coatscience"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/cup/bottle, /obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/police/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/wintercoat_science
hoodtype = /obj/item/clothing/head/hooded/winterhood/science
+
+/datum/armor/wintercoat_science
+ bomb = 10
+
/obj/item/clothing/head/hooded/winterhood/science
icon_state = "winterhood_science"
@@ -297,10 +399,16 @@
name = "engineering winter coat"
icon_state = "coatengineer"
item_state = "coatengineer"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 20, FIRE = 30, ACID = 45, STAMINA = 0)
+ armor_type = /datum/armor/wintercoat_engineering
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering
+
+/datum/armor/wintercoat_engineering
+ rad = 20
+ fire = 30
+ acid = 45
+
/obj/item/clothing/head/hooded/winterhood/engineering
icon_state = "winterhood_engineer"
@@ -373,11 +481,24 @@
)
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = CHEST|GROIN|ARMS
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 10, RAD = 20, FIRE = 50, ACID = 50, STAMINA = 20)
+ armor_type = /datum/armor/wintercoat_miner
resistance_flags = FIRE_PROOF
high_pressure_multiplier = 0.4
hoodtype = /obj/item/clothing/head/hooded/winterhood/miner
+
+/datum/armor/wintercoat_miner
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 50
+ bio = 10
+ rad = 20
+ fire = 50
+ acid = 50
+ stamina = 20
+
/obj/item/clothing/suit/hooded/wintercoat/miner/Initialize(mapload)
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -386,10 +507,23 @@
desc = "A hood attached to a heavy winter jacket. It is quite armoured and well suited to explore harsh environments."
icon_state = "winterhood_miner"
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 10, RAD = 20, FIRE = 50, ACID = 50, STAMINA = 20)
+ armor_type = /datum/armor/winterhood_miner
resistance_flags = FIRE_PROOF
high_pressure_multiplier = 0.4
+
+/datum/armor/winterhood_miner
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 50
+ bio = 10
+ rad = 20
+ fire = 50
+ acid = 50
+ stamina = 20
+
/obj/item/clothing/head/hooded/winterhood/miner/Initialize(mapload)
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -475,13 +609,37 @@
desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper."
icon_state = "coatcentcom"
item_state = "coatcentcom"
- armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, RAD = 10, FIRE = 10, ACID = 60)
+ armor_type = /datum/armor/wintercoat_centcom
hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
+
+/datum/armor/wintercoat_centcom
+ melee = 35
+ bullet = 40
+ laser = 40
+ energy = 50
+ bomb = 35
+ bio = 10
+ rad = 10
+ fire = 10
+ acid = 60
+
/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize(mapload)
. = ..()
allowed += GLOB.security_wintercoat_allowed
/obj/item/clothing/head/hooded/winterhood/centcom
icon_state = "hood_centcom"
- armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, RAD = 10, FIRE = 10, ACID = 60)
+ armor_type = /datum/armor/winterhood_centcom
+
+
+/datum/armor/winterhood_centcom
+ melee = 35
+ bullet = 40
+ laser = 40
+ energy = 50
+ bomb = 35
+ bio = 10
+ rad = 10
+ fire = 10
+ acid = 60
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index a528de93e2b19..1d59a7a2484c5 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -6,14 +6,27 @@
icon_state = "wizard"
item_state = "wizhat"
gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE
- permeability_coefficient = 0.01
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 50, BLEED = 60)
+ armor_type = /datum/armor/head_wizard
strip_delay = 50
equip_delay_other = 50
clothing_flags = SNUG_FIT | THICKMATERIAL
resistance_flags = FIRE_PROOF | ACID_PROOF
dog_fashion = /datum/dog_fashion/head/blue_wizard
+
+/datum/armor/head_wizard
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 20
+ bio = 100
+ rad = 20
+ fire = 100
+ acid = 100
+ stamina = 50
+ bleed = 60
+
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
desc = "Strange-looking red hat-wear that most certainly belongs to a real magic user."
@@ -37,8 +50,7 @@
desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
icon_state = "wizard-fake"
gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0)
+ armor_type = /datum/armor/none
resistance_flags = FLAMMABLE
dog_fashion = /datum/dog_fashion/head/blue_wizard
clothing_flags = NONE
@@ -72,9 +84,8 @@
worn_icon = 'icons/mob/clothing/suits/wizard.dmi'
item_state = "wizrobe"
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
body_parts_covered = CHEST|GROIN|ARMS|LEGS
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 50, BLEED = 60)
+ armor_type = /datum/armor/suit_wizrobe
allowed = list(/obj/item/teleportation_scroll)
flags_inv = HIDEJUMPSUIT
strip_delay = 50
@@ -82,6 +93,20 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
clothing_flags = THICKMATERIAL
+
+/datum/armor/suit_wizrobe
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 20
+ bio = 100
+ rad = 20
+ fire = 100
+ acid = 100
+ stamina = 50
+ bleed = 60
+
/obj/item/clothing/suit/wizrobe/ComponentInitialize()
. = ..()
add_anti_artifact()
@@ -142,8 +167,7 @@
icon_state = "wizard-fake"
item_state = "wizrobe"
gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0)
+ armor_type = /datum/armor/none
resistance_flags = FLAMMABLE
clothing_flags = NONE
@@ -152,8 +176,7 @@
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0)
+ armor_type = /datum/armor/none
resistance_flags = FLAMMABLE
clothing_flags = NONE
@@ -163,8 +186,7 @@
icon_state = "marisa"
item_state = "marisarobe"
gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0)
+ armor_type = /datum/armor/none
resistance_flags = FLAMMABLE
clothing_flags = NONE
@@ -216,10 +238,24 @@
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70)
+ armor_type = /datum/armor/shielded_wizard
slowdown = 0
resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/datum/armor/shielded_wizard
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 20
+ bio = 20
+ rad = 20
+ fire = 100
+ acid = 100
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/suit/space/hardsuit/shielded/wizard/setup_shielding()
AddComponent(/datum/component/shielded, max_integrity = 600, charge_recovery = 0 SECONDS, charge_increment_delay = 1 SECONDS, shield_icon = "shield-red")
@@ -230,10 +266,24 @@
item_state = "battlemage"
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70)
+ armor_type = /datum/armor/shielded_wizard
actions_types = null //No inbuilt light
resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/datum/armor/shielded_wizard
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 20
+ bio = 20
+ rad = 20
+ fire = 100
+ acid = 100
+ stamina = 70
+ bleed = 70
+
/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/attack_self(mob/user)
return
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index 3707e40f06c56..ae01dc5c1ce5b 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -3,9 +3,8 @@
icon = 'icons/obj/clothing/under/default.dmi'
worn_icon = 'icons/mob/clothing/under/default.dmi'
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- permeability_coefficient = 0.9
slot_flags = ITEM_SLOT_ICLOTHING
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/clothing_under
drop_sound = 'sound/items/handling/cloth_drop.ogg'
pickup_sound = 'sound/items/handling/cloth_pickup.ogg'
/// The variable containing the flags for how the woman uniform cropping is supposed to interact with the sprite.
@@ -21,6 +20,11 @@
var/freshly_laundered = FALSE
dying_key = DYE_REGISTRY_UNDER
+
+/datum/armor/clothing_under
+ bio = 10
+ bleed = 10
+
/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file, item_layer, atom/origin)
. = list()
if(!isinhands)
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 402a8a1e72beb..028afaed4b543 100755
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -39,18 +39,7 @@
pixel_y -= 8
U.add_overlay(src)
- /**
- ** This proc can run before /obj/Initialize has run for U and src,
- ** we have to check that the armor list has been transformed into a datum before we try to call a proc on it
- ** This is safe to do as /obj/Initialize only handles setting up the datum if actually needed.
- **/
- if (islist(U.armor) || isnull(U.armor))
- U.armor = getArmor(arglist(U.armor))
-
- if (islist(armor) || isnull(armor))
- armor = getArmor(arglist(armor))
-
- U.armor = U.armor.attachArmor(armor)
+ U.set_armor(U.get_armor().add_other_armor(get_armor()))
if(isliving(user))
on_uniform_equip(U, user)
@@ -61,7 +50,7 @@
if(detached_pockets && detached_pockets.parent == U)
TakeComponent(detached_pockets)
- U.armor = U.armor.detachArmor(armor)
+ U.set_armor(U.get_armor().subtract_other_armor(get_armor()))
if(isliving(user))
on_uniform_dropped(U, user)
@@ -233,9 +222,13 @@
desc = "An eccentric medal made of plasma."
icon_state = "plasma"
medaltype = "medal-plasma"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = -10, ACID = 0, STAMINA = 0, BLEED = 0) //It's made of plasma. Of course it's flammable.
+ armor_type = /datum/armor/medal_plasma
custom_materials = list(/datum/material/plasma=1000)
+
+/datum/armor/medal_plasma
+ fire = -10
+
/obj/item/clothing/accessory/medal/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > 300)
atmos_spawn_air("plasma=20;TEMP=[exposed_temperature]")
@@ -366,17 +359,43 @@
name = "bone talisman"
desc = "A hunter's talisman, some say the old gods smile on those who wear it."
icon_state = "talisman"
- armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/accessory_talisman
attachment_slot = null
+
+/datum/armor/accessory_talisman
+ melee = 5
+ bullet = 5
+ laser = 5
+ energy = 5
+ bomb = 20
+ bio = 20
+ rad = 5
+ acid = 25
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/accessory/skullcodpiece
name = "skull codpiece"
desc = "A skull shaped ornament, intended to protect the important things in life."
icon_state = "skull"
above_suit = TRUE
- armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/accessory_skullcodpiece
attachment_slot = GROIN
+
+/datum/armor/accessory_skullcodpiece
+ melee = 5
+ bullet = 5
+ laser = 5
+ energy = 5
+ bomb = 20
+ bio = 20
+ rad = 5
+ acid = 25
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/accessory/holster
name = "shoulder holster"
desc = "A holster to carry a handgun and ammo. WARNING: Badasses only."
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 63fcd30940a10..b67fa930a94a2 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -222,13 +222,37 @@
name = "durathread jumpsuit"
desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer."
greyscale_colors = "#8291a1"
- armor = list(MELEE = 10, BULLET = 15, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, ENERGY = 20, STAMINA = 20, BLEED = 30)
+ armor_type = /datum/armor/color_durathread
+
+
+/datum/armor/color_durathread
+ melee = 10
+ bullet = 15
+ laser = 10
+ fire = 40
+ acid = 10
+ bomb = 5
+ energy = 20
+ stamina = 20
+ bleed = 30
/obj/item/clothing/under/color/jumpskirt/durathread
name = "durathread jumpskirt"
desc = "A jumpskirt made from durathread, its resilient fibres provide some protection to the wearer."
greyscale_colors = "#8291a1"
- armor = list(MELEE = 10, BULLET = 15, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, ENERGY = 20, STAMINA = 20, BLEED = 30)
+ armor_type = /datum/armor/jumpskirt_durathread
+
+
+/datum/armor/jumpskirt_durathread
+ melee = 10
+ bullet = 15
+ laser = 10
+ fire = 40
+ acid = 10
+ bomb = 5
+ energy = 20
+ stamina = 20
+ bleed = 30
/obj/item/clothing/under/color/rainbow
name = "rainbow jumpsuit"
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index c93a5348fb1c6..4093cd69f3818 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -292,12 +292,20 @@
item_state = null
worn_icon = 'icons/mob/clothing/under/security.dmi'
alt_covers_chest = TRUE
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 15)
+ armor_type = /datum/armor/costume_russian_officer
strip_delay = 50
alt_covers_chest = TRUE
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+
+/datum/armor/costume_russian_officer
+ melee = 10
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 15
+
/obj/item/clothing/under/costume/swagoutfit
name = "swag outfit"
desc = "Why don't you go secure some bitches?"
diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
index b6153579c1075..242e72caaf5ec 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm
@@ -5,7 +5,7 @@
item_state = "plasmaman"
icon = 'icons/obj/clothing/under/plasmaman.dmi'
worn_icon = 'icons/mob/clothing/under/plasmaman.dmi'
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 0)
+ armor_type = /datum/armor/under_plasmaman
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
can_adjust = FALSE
strip_delay = 80
@@ -16,6 +16,12 @@
envirosealed = TRUE
+
+/datum/armor/under_plasmaman
+ bio = 100
+ fire = 95
+ acid = 95
+
/obj/item/clothing/under/plasmaman/examine(mob/user)
. = ..()
. += "There are [extinguishes_left] extinguisher charges left in this suit."
diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
index e50357a9e4749..11c7ff7aace5c 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm
@@ -3,7 +3,15 @@
desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage."
icon_state = "engineer_envirosuit"
item_state = "engineer_envirosuit"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 95, ACID = 95, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/plasmaman_engineering
+
+
+/datum/armor/plasmaman_engineering
+ bio = 100
+ rad = 10
+ fire = 95
+ acid = 95
+ bleed = 10
/obj/item/clothing/under/plasmaman/engineering/atmospherics
name = "atmospherics plasma envirosuit"
diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm
index 26282303438f1..673fff4904bf1 100644
--- a/code/modules/clothing/under/jobs/Plasmaman/security.dm
+++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm
@@ -3,10 +3,19 @@
desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection."
icon_state = "security_envirosuit"
item_state = "security_envirosuit"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/plasmaman_security
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+
+/datum/armor/plasmaman_security
+ melee = 10
+ bio = 100
+ fire = 95
+ acid = 95
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/under/plasmaman/security/warden
name = "warden plasma envirosuit"
desc = "A plasmaman containment suit designed for the warden, white stripes being added to differeciate them from other members of security."
@@ -24,4 +33,13 @@
desc = "A plasmaman containment suit designed for brig physicians. It has a red cross emblasoned on the chest."
icon_state = "secmed_envirosuit"
item_state = "secmed_envirosuit"
- armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/security_secmed
+
+
+/datum/armor/security_secmed
+ melee = 5
+ bio = 100
+ fire = 95
+ acid = 95
+ stamina = 10
+ bleed = 10
diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm
index 3363551835b5c..79ef8bf1d2d94 100644
--- a/code/modules/clothing/under/jobs/cargo.dm
+++ b/code/modules/clothing/under/jobs/cargo.dm
@@ -62,6 +62,13 @@
name = "shaft miner's jumpsuit"
icon_state = "miner"
item_state = "miner"
+ armor_type = /datum/armor/cargo_miner
+
+
+/datum/armor/cargo_miner
+ bio = 10
+ fire = 80
+ bleed = 10
/obj/item/clothing/under/rank/cargo/miner/lavaland
desc = "A green uniform for operating in hazardous environments."
diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm
index b2794cf904a2b..8e774dd187e69 100644
--- a/code/modules/clothing/under/jobs/civilian/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian/civilian.dm
@@ -109,7 +109,11 @@
name = "botanist's jumpsuit"
icon_state = "hydroponics"
item_state = "g_suit"
- permeability_coefficient = 0.5
+ armor_type = /datum/armor/civilian_hydroponics
+
+
+/datum/armor/civilian_hydroponics
+ bio = 50
/obj/item/clothing/under/rank/civilian/hydroponics/skirt
name = "botanist's jumpskirt"
@@ -126,7 +130,12 @@
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
icon_state = "janitor"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/civilian_janitor
+
+
+/datum/armor/civilian_janitor
+ bio = 10
+ bleed = 10
/obj/item/clothing/under/rank/civilian/janitor/skirt
name = "janitor's jumpskirt"
diff --git a/code/modules/clothing/under/jobs/civilian/curator.dm b/code/modules/clothing/under/jobs/civilian/curator.dm
index 8cb9673626dcd..dd8d9c1877288 100644
--- a/code/modules/clothing/under/jobs/civilian/curator.dm
+++ b/code/modules/clothing/under/jobs/civilian/curator.dm
@@ -40,7 +40,7 @@
greyscale_config_worn = /datum/greyscale_config/jumpsuit_worn
w_class = WEIGHT_CLASS_BULKY
gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.02
+ armor_type = /datum/armor/curator_nasa
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST | GROIN | LEGS | ARMS //Needs gloves and shoes with cold protection to be fully protected.
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
@@ -48,3 +48,7 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = FALSE
resistance_flags = NONE
+
+
+/datum/armor/curator_nasa
+ bio = 95
diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm
index 3c560e2388d9c..b4c328c03eb80 100644
--- a/code/modules/clothing/under/jobs/command.dm
+++ b/code/modules/clothing/under/jobs/command.dm
@@ -3,12 +3,21 @@
name = "captain's jumpsuit"
icon_state = "captain"
item_state = "b_suit"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/rank_captain
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
icon = 'icons/obj/clothing/under/captain.dmi'
worn_icon = 'icons/mob/clothing/under/captain.dmi'
+
+/datum/armor/rank_captain
+ melee = 10
+ bio = 10
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/under/rank/captain/skirt
name = "captain's jumpskirt"
desc = "It's a blue jumpskirt with some gold markings denoting the rank of \"Captain\"."
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index ff4acd17c6aa6..5cb5f13bfc358 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -3,30 +3,52 @@
/obj/item/clothing/under/rank/engineering
icon = 'icons/obj/clothing/under/engineering.dmi'
worn_icon = 'icons/mob/clothing/under/engineering.dmi'
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, STAMINA = 0)
+ armor_type = /datum/armor/rank_engineering
resistance_flags = NONE
+
+/datum/armor/rank_engineering
+ bio = 10
+ rad = 10
+ fire = 60
+ acid = 20
+
/obj/item/clothing/under/rank/engineering/chief_engineer
desc = "It's a high visibility jumpsuit given to those engineers insane enough to achieve the rank of \"Chief Engineer\". It has minor radiation shielding."
name = "chief engineer's jumpsuit"
icon_state = "chiefengineer"
item_state = "gy_suit" //TODO replace it
worn_icon_state = "chiefengineer"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/engineering_chief_engineer
resistance_flags = NONE
+
+/datum/armor/engineering_chief_engineer
+ bio = 10
+ rad = 10
+ fire = 80
+ acid = 40
+ bleed = 10
+
/obj/item/clothing/under/rank/engineering/chief_engineer/skirt
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief Engineer\". It has very minor radiation shielding."
name = "chief engineer's jumpskirt"
icon_state = "chiefengineer_skirt"
item_state = "gy_suit"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 7, FIRE = 80, ACID = 40, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/chief_engineer_skirt
body_parts_covered = CHEST|GROIN|ARMS
can_adjust = FALSE
female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY
supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON
dying_key = DYE_REGISTRY_JUMPSKIRT
+
+/datum/armor/chief_engineer_skirt
+ rad = 7
+ fire = 80
+ acid = 40
+ bleed = 10
+
/obj/item/clothing/under/rank/engineering/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
name = "atmospheric technician's jumpsuit"
@@ -50,9 +72,16 @@
name = "engineer's jumpsuit"
icon_state = "engine"
item_state = "engi_suit"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/engineering_engineer
resistance_flags = NONE
+
+/datum/armor/engineering_engineer
+ rad = 10
+ fire = 60
+ acid = 20
+ bleed = 10
+
/obj/item/clothing/under/rank/engineering/engineer/hazard
name = "engineer's hazard jumpsuit"
desc = "A high visibility jumpsuit made from heat and radiation resistant materials."
diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm
index d1050f6c01374..b05d2abc5fc9f 100644
--- a/code/modules/clothing/under/jobs/medical.dm
+++ b/code/modules/clothing/under/jobs/medical.dm
@@ -1,15 +1,17 @@
/obj/item/clothing/under/rank/medical
icon = 'icons/obj/clothing/under/medical.dmi'
worn_icon = 'icons/mob/clothing/under/medical.dmi'
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0)
+ armor_type = /datum/armor/rank_medical
+
+
+/datum/armor/rank_medical
+ bio = 50
/obj/item/clothing/under/rank/medical/chief_medical_officer
desc = "It's a jumpsuit worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
name = "chief medical officer's jumpsuit"
icon_state = "cmo"
item_state = "w_suit"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
/obj/item/clothing/under/rank/medical/chief_medical_officer/skirt
name = "chief medical officer's jumpskirt"
@@ -27,8 +29,6 @@
name = "geneticist's jumpsuit"
icon_state = "genetics"
item_state = "w_suit"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
/obj/item/clothing/under/rank/medical/geneticist/skirt
name = "geneticist's jumpskirt"
@@ -46,8 +46,6 @@
name = "virologist's jumpsuit"
icon_state = "virology"
item_state = "w_suit"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
/obj/item/clothing/under/rank/medical/virologist/skirt
name = "virologist's jumpskirt"
@@ -64,8 +62,6 @@
name = "paramedic's jumpsuit"
desc = "A standard jumpsuit used by paramedics onboard space stations. It's made of a special fiber that gives special protection against biohazards."
icon_state = "paramedic"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
can_adjust = FALSE
/obj/item/clothing/under/rank/medical/paramedic/skirt
@@ -84,8 +80,6 @@
name = "nurse's suit"
icon_state = "nursesuit"
item_state = "w_suit"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
body_parts_covered = CHEST|GROIN|ARMS
female_sprite_flags = NO_FEMALE_UNIFORM
can_adjust = FALSE
@@ -95,8 +89,6 @@
name = "medical doctor's jumpsuit"
icon_state = "medical"
item_state = "w_suit"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
/obj/item/clothing/under/rank/medical/doctor/skirt
name = "medical doctor's jumpskirt"
@@ -132,8 +124,14 @@
name = "chemist's jumpsuit"
icon_state = "chemistry"
item_state = "w_suit"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 65, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/medical_chemist
+
+
+/datum/armor/medical_chemist
+ bio = 50
+ fire = 50
+ acid = 65
+ bleed = 10
/obj/item/clothing/under/rank/medical/chemist/skirt
name = "chemist's jumpskirt"
diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm
index b69a76e9e6ac2..26c84d40f3b14 100644
--- a/code/modules/clothing/under/jobs/rnd.dm
+++ b/code/modules/clothing/under/jobs/rnd.dm
@@ -7,10 +7,17 @@
desc = "It's a jumpsuit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants."
icon_state = "director"
item_state = "w_suit"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 35, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/rnd_research_director
can_adjust = TRUE
alt_covers_chest = TRUE
+
+/datum/armor/rnd_research_director
+ bomb = 10
+ bio = 10
+ acid = 35
+ bleed = 10
+
/obj/item/clothing/under/rank/rnd/research_director/skirt
name = "research director's jumpskirt"
desc = "It's a jumpskirt worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants."
@@ -27,10 +34,16 @@
name = "research director's tan suit"
icon_state = "rdwhimsy"
item_state = "rdwhimsy"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/research_director_alt
can_adjust = TRUE
alt_covers_chest = TRUE
+
+/datum/armor/research_director_alt
+ bomb = 10
+ bio = 10
+ bleed = 10
+
/obj/item/clothing/under/rank/rnd/research_director/alt/skirt
name = "research director's tan suitskirt"
desc = "Maybe you'll engineer your own half-man, half-pig creature some day. Its fabric provides minor protection from biological contaminants."
@@ -47,10 +60,16 @@
name = "research director's turtleneck"
icon_state = "rdturtle"
item_state = "p_suit"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/research_director_turtleneck
can_adjust = TRUE
alt_covers_chest = TRUE
+
+/datum/armor/research_director_turtleneck
+ bomb = 10
+ bio = 10
+ bleed = 10
+
/obj/item/clothing/under/rank/rnd/research_director/turtleneck/skirt
name = "research director's turtleneck skirt"
desc = "A dark purple turtleneck and tan khaki skirt, for a director with a superior sense of style."
@@ -75,8 +94,13 @@
icon_state = "toxinswhite"
item_state = "w_suit"
worn_icon_state = "toxinswhite"
- permeability_coefficient = 0.5
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/rnd_scientist
+
+
+/datum/armor/rnd_scientist
+ bomb = 10
+ bio = 50
+ bleed = 10
/obj/item/clothing/under/rank/rnd/scientist/skirt
name = "scientist's jumpskirt"
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index 3e27da57d62da..6663c9caaabbd 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -12,19 +12,35 @@
/obj/item/clothing/under/rank/security
icon = 'icons/obj/clothing/under/security.dmi'
worn_icon = 'icons/mob/clothing/under/security.dmi'
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10)
+ armor_type = /datum/armor/rank_security
strip_delay = 50
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+
+/datum/armor/rank_security
+ melee = 10
+ bio = 10
+ fire = 30
+ acid = 30
+ stamina = 10
+
/obj/item/clothing/under/rank/security/officer
name = "security jumpsuit"
desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle."
icon_state = "rsecurity"
item_state = "r_suit"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/security_officer
alt_covers_chest = TRUE
+
+/datum/armor/security_officer
+ melee = 10
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/under/rank/security/officer/white
name = "white security jumpsuit"
desc = "A tactical relic of years past before Nanotrasen decided it was cheaper to dye the suits red instead of washing out the blood."
@@ -71,7 +87,15 @@
desc = "A formal security suit for officers complete with Nanotrasen belt buckle."
icon_state = "rwarden"
item_state = "r_suit"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/security_warden
+
+
+/datum/armor/security_warden
+ melee = 10
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 10
/obj/item/clothing/under/rank/security/warden/white
name = "white security suit"
@@ -105,12 +129,20 @@
desc = "Someone who wears this means business."
icon_state = "detective"
item_state = "det"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/security_detective
strip_delay = 50
alt_covers_chest = TRUE
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+
+/datum/armor/security_detective
+ melee = 10
+ fire = 30
+ acid = 30
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/under/rank/security/detective/skirt
name = "detective's suitskirt"
desc = "Someone who wears this means business."
@@ -148,12 +180,21 @@
desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security."
icon_state = "rhos"
item_state = "r_suit"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/security_head_of_security
strip_delay = 60
alt_covers_chest = TRUE
sensor_mode = SENSOR_COORDS
random_sensor = FALSE
+
+/datum/armor/security_head_of_security
+ melee = 10
+ bio = 10
+ fire = 50
+ acid = 50
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/under/rank/security/head_of_security/skirt
name = "head of security's jumpskirt"
desc = "A security jumpskirt decorated for those few with the dedication to achieve the position of Head of Security."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index fe03c6e7e234a..4b6baa308554a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -37,10 +37,8 @@
item_state = "bl_suit"
worn_icon = 'icons/mob/clothing/under/syndicate.dmi'
desc = "A cybernetically enhanced jumpsuit used for administrative duties."
- gas_transfer_coefficient = 0.01
- permeability_coefficient = 0.01
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100)
+ armor_type = /datum/armor/misc_adminsuit
cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
@@ -49,6 +47,20 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
blocks_shove_knockdown = TRUE
+
+/datum/armor/misc_adminsuit
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+ bleed = 100
+
/obj/item/clothing/under/misc/burial
name = "burial garments"
desc = "Traditional burial garments from the early 22nd century."
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index a599447bca044..672adcb5fd087 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -4,17 +4,33 @@
icon_state = "syndicate"
item_state = "bl_suit"
has_sensor = NO_SENSORS
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, STAMINA = 10, BLEED = 25)
+ armor_type = /datum/armor/under_syndicate
alt_covers_chest = TRUE
icon = 'icons/obj/clothing/under/syndicate.dmi'
worn_icon = 'icons/mob/clothing/under/syndicate.dmi'
+
+/datum/armor/under_syndicate
+ melee = 10
+ bio = 10
+ fire = 50
+ acid = 40
+ stamina = 10
+ bleed = 25
+
/obj/item/clothing/under/syndicate/tacticool
name = "tacticool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool"
item_state = "bl_suit"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, STAMINA = 0, BLEED = 10)
+ armor_type = /datum/armor/syndicate_tacticool
+
+
+/datum/armor/syndicate_tacticool
+ bio = 10
+ fire = 50
+ acid = 40
+ bleed = 10
/obj/item/clothing/under/syndicate/sniper
name = "Tactical turtleneck suit"
@@ -35,9 +51,16 @@
desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in."
icon_state = "trackpants"
can_adjust = FALSE
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10, BLEED = 15)
+ armor_type = /datum/armor/syndicate_soviet
resistance_flags = NONE
+
+/datum/armor/syndicate_soviet
+ melee = 10
+ bio = 10
+ stamina = 10
+ bleed = 15
+
/obj/item/clothing/under/syndicate/combat
name = "combat uniform"
desc = "With a suit lined with this many pockets, you are ready to operate."
@@ -49,5 +72,12 @@
desc = "Military grade tracksuits for frontline squatting."
icon_state = "rus_under"
can_adjust = FALSE
- armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10, BLEED = 15)
+ armor_type = /datum/armor/syndicate_rus_army
resistance_flags = NONE
+
+
+/datum/armor/syndicate_rus_army
+ melee = 5
+ bio = 10
+ stamina = 10
+ bleed = 15
diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm
index 3e89917cdc11f..90ca6437a1499 100644
--- a/code/modules/clothing/under/trek.dm
+++ b/code/modules/clothing/under/trek.dm
@@ -18,9 +18,15 @@
desc = "The uniform worn by engineering/security officers."
icon_state = "trek_engsec"
item_state = "r_suit"
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) //more sec than eng, but w/e.
+ armor_type = /datum/armor/trek_engsec
strip_delay = 50
+
+/datum/armor/trek_engsec
+ melee = 10
+ bio = 10
+ bleed = 10
+
/obj/item/clothing/under/trek/medsci
name = "medsci uniform"
desc = "The uniform worn by medical/science officers."
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index 8a956238270b7..7592551b0b1a7 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -38,16 +38,37 @@
icon_state = "xmashat"
desc = "A crappy paper hat that you are REQUIRED to wear."
flags_inv = 0
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/none
/obj/item/clothing/head/costume/festive/Initialize(mapload)
//Merry christmas
if(CHRISTMAS in SSevents.holidays)
- armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 30, RAD = 30, FIRE = 30, ACID = 30, STAMINA = 30, BLEED = 30)
+ armor_type = /datum/armor/festivehat_christmas
else if(FESTIVE_SEASON in SSevents.holidays)
- armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 20, ACID = 20, STAMINA = 20, BLEED = 20)
+ armor_type = /datum/armor/festivehat_december
return ..()
+/datum/armor/festivehat_christmas
+ melee = 30
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 30
+ rad = 30
+ fire = 30
+ acid = 30
+
+/datum/armor/festivehat_december
+ melee = 20
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 20
+ rad = 20
+ fire = 20
+ acid = 20
+
+
/obj/effect/spawner/xmastree
name = "christmas tree spawner"
icon = 'icons/effects/landmarks_static.dmi'
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index 8adb6c7ef9870..3e3ee79318fdf 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -135,6 +135,6 @@
I.force = max(0,I.force + quality_mod)
I.throwforce = max(0,I.throwforce + quality_mod)
- I.armor = I.armor.modifyAllRatings(quality)
+ I.set_armor(I.get_armor().generate_new_with_modifiers(list(ARMOR_ALL = -quality)))
rename()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 90d1fe3bb5ac8..706d4ba4144f1 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -215,14 +215,14 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list(
if(user.grab_state < GRAB_AGGRESSIVE)
to_chat(user, "You need a better grip to do that!")
return
- var/mob/living/carbon/C = user.pulling
- user.visible_message("[user] dunks [C]'s face in [src]!")
- reagents.reaction(C, TOUCH)
- log_combat(user, C, "fryer slammed")
- var/permeability = 1 - C.get_permeability_protection(list(HEAD))
- C.apply_damage(min(30 * permeability, reagents.total_volume), BURN, BODY_ZONE_HEAD)
+ var/mob/living/carbon/dunking_target = user.pulling
+ user.visible_message("[user] dunks [dunking_target]'s face in [src]!")
+ reagents.reaction(dunking_target, TOUCH)
+ log_combat(user, dunking_target, "fryer slammed")
+ var/bio_multiplier = dunking_target.getarmor(BODY_ZONE_HEAD, BIO) * 0.01
+ dunking_target.apply_damage(min(30 * bio_multiplier, reagents.total_volume), BURN, BODY_ZONE_HEAD)
reagents.remove_any((reagents.total_volume/2))
- C.Paralyze(60)
+ dunking_target.Paralyze(60)
user.changeNext_move(CLICK_CD_MELEE)
return ..()
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 5710d58fc701b..86825f0934a88 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -24,7 +24,7 @@
opacity = FALSE
resistance_flags = FLAMMABLE
max_integrity = 200
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, CONSUME = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_bookcase
var/state = BOOKCASE_UNANCHORED
var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book, /obj/item/codex_cicatrix) //Things allowed in the bookcase
/// When enabled, books_to_load number of random books will be generated for this bookcase when first interacted with.
@@ -34,6 +34,10 @@
/// How many random books to generate.
var/books_to_load = 0
+
+/datum/armor/structure_bookcase
+ fire = 50
+
/obj/structure/bookcase/Initialize(mapload)
. = ..()
if(!mapload || QDELETED(src))
diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm
index 467d6464a9af5..3b316a777b250 100644
--- a/code/modules/mining/equipment/explorer_gear.dm
+++ b/code/modules/mining/equipment/explorer_gear.dm
@@ -7,12 +7,12 @@
worn_icon = 'icons/mob/clothing/suits/utility.dmi'
item_state = null
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = CHEST|GROIN|LEGS|ARMS
- max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
heat_protection = CHEST|GROIN|LEGS|ARMS
+ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
hoodtype = /obj/item/clothing/head/hooded/explorer
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 30)
+ armor_type = /datum/armor/hooded_explorer
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals,
@@ -26,6 +26,19 @@
high_pressure_multiplier = 0.4
flags_inv = HIDEJUMPSUIT
+
+/datum/armor/hooded_explorer
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 50
+ rad = 50
+ fire = 50
+ acid = 50
+ stamina = 20
+ bleed = 30
+
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
@@ -34,12 +47,27 @@
icon_state = "explorer"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
+ cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
- max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 30)
+ heat_protection = HEAD
+ max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
+ armor_type = /datum/armor/hooded_explorer
resistance_flags = FIRE_PROOF
high_pressure_multiplier = 0.4
+
+/datum/armor/hooded_explorer
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 20
+ bomb = 50
+ rad = 50
+ fire = 50
+ acid = 50
+ stamina = 20
+ bleed = 30
+
/obj/item/clothing/suit/hooded/explorer/Initialize(mapload)
. = ..()
AddComponent(/datum/component/armor_plate)
@@ -58,9 +86,21 @@
visor_flags_inv = HIDEFACIALHAIR
visor_flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
actions_types = list(/datum/action/item_action/adjust)
- armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 10, BLEED = 10)
+ armor_type = /datum/armor/gas_explorer
resistance_flags = FIRE_PROOF
+
+/datum/armor/gas_explorer
+ melee = 10
+ bullet = 5
+ laser = 5
+ energy = 5
+ bio = 50
+ fire = 20
+ acid = 40
+ stamina = 10
+ bleed = 10
+
/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
adjustmask(user)
@@ -83,10 +123,23 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | LAVA_PROOF
slowdown = 0
- armor = list(MELEE = 70, BULLET = 40, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 40, BLEED = 50)
+ armor_type = /datum/armor/space_hostile_environment
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/pickaxe)
high_pressure_multiplier = 0.6
+
+/datum/armor/space_hostile_environment
+ melee = 70
+ bullet = 40
+ laser = 20
+ energy = 20
+ bomb = 50
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 40
+ bleed = 50
+
/obj/item/clothing/suit/space/hostile_environment/Initialize(mapload)
. = ..()
AddComponent(/datum/component/spraycan_paintable)
@@ -111,10 +164,23 @@
w_class = WEIGHT_CLASS_NORMAL
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
clothing_flags = THICKMATERIAL // no space protection
- armor = list(MELEE = 70, BULLET = 40, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 40, BLEED = 50)
+ armor_type = /datum/armor/space_hostile_environment
resistance_flags = FIRE_PROOF | LAVA_PROOF
high_pressure_multiplier = 0.6
+
+/datum/armor/space_hostile_environment
+ melee = 70
+ bullet = 40
+ laser = 20
+ energy = 20
+ bomb = 50
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 40
+ bleed = 50
+
/obj/item/clothing/head/helmet/space/hostile_environment/Initialize(mapload)
. = ..()
AddComponent(/datum/component/spraycan_paintable)
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index fc16c001d50ec..40d05041124c4 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list(
icon = 'icons/obj/lighting.dmi'
icon_state = "markerrandom"
layer = BELOW_OPEN_DOOR_LAYER
- armor = list(MELEE = 50, BULLET = 75, LASER = 75, ENERGY = 75, BOMB = 25, BIO = 100, RAD = 100, FIRE = 25, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_marker_beacon
max_integrity = 50
anchored = TRUE
light_range = 2
@@ -84,6 +84,17 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list(
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/marker_beacon)
+
+/datum/armor/structure_marker_beacon
+ melee = 50
+ bullet = 75
+ laser = 75
+ energy = 75
+ bomb = 25
+ bio = 100
+ rad = 100
+ fire = 25
+
/obj/structure/marker_beacon/Initialize(mapload, set_color)
. = ..()
picked_color = set_color
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 88aa17293bc9a..2ec126b7947dd 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -684,7 +684,19 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/shared_storage/blue)
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
resistance_flags = LAVA_PROOF | FIRE_PROOF //they are from lavaland after all
- armor = list(MELEE = 15, BULLET = 35, LASER = 35, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0, STAMINA = 20, BLEED = 20) //Equivalent to bone bracers. Not bad.
+ armor_type = /datum/armor/gloves_concussive_gauntlets
+
+
+/datum/armor/gloves_concussive_gauntlets
+ melee = 15
+ bullet = 35
+ laser = 35
+ energy = 20
+ bomb = 35
+ bio = 35
+ rad = 35
+ stamina = 20
+ bleed = 20
/obj/item/clothing/gloves/concussive_gauntlets/equipped(mob/user, slot)
. = ..()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 1b19cd7eb2b4e..19796e27868b0 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -45,9 +45,6 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
pulledby.stop_pulling()
. = 0
-/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones)
- return 0.8
-
/mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno)
drop_all_held_items()
return ..()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index d4c63aa181606..fd7e668c4103e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -612,17 +612,6 @@ CREATION_TEST_IGNORE_SELF(/mob/living/carbon)
else
. += INFINITY
-/mob/living/carbon/get_permeability_protection(list/target_zones = list(HANDS = 0, CHEST = 0, GROIN = 0, LEGS = 0, FEET = 0, ARMS = 0, HEAD = 0))
- for(var/obj/item/I in get_equipped_items())
- for(var/zone in target_zones)
- if(I.body_parts_covered & zone)
- target_zones[zone] = max(1 - I.permeability_coefficient, target_zones[zone])
- var/protection = 0
- for(var/zone in target_zones)
- protection += target_zones[zone]
- protection *= INVERSE(target_zones.len)
- return protection
-
//this handles hud updates
/mob/living/carbon/update_damage_hud()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index f4d32dbaa9d60..b059f1999d39f 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -42,9 +42,9 @@
if(bp && isclothing(bp))
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
- protection *= 1 - min((C.get_armor_rating(d_type, src) / 100) * (1 - (penetration / 100)), 1)
+ protection *= 1 - min((C.get_armor_rating(d_type) / 100) * (1 - (penetration / 100)), 1)
- protection *= 1 - CLAMP01(physiology.armor.getRating(d_type) / 100)
+ protection *= 1 - CLAMP01(physiology.physio_armor.get_rating(d_type) / 100)
return (1 - protection) * 100
///Get all the clothing on a specific body part
diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm
index 6a0511102408a..f30c176447412 100644
--- a/code/modules/mob/living/carbon/human/physiology.dm
+++ b/code/modules/mob/living/carbon/human/physiology.dm
@@ -1,28 +1,45 @@
//Stores several modifiers in a way that isn't cleared by changing species
-
/datum/physiology
- var/brute_mod = 1 // % of brute damage taken from all sources
- var/burn_mod = 1 // % of burn damage taken from all sources
- var/tox_mod = 1 // % of toxin damage taken from all sources
- var/oxy_mod = 1 // % of oxygen damage taken from all sources
- var/clone_mod = 1 // % of clone damage taken from all sources
- var/stamina_mod = 1 // % of stamina damage taken from all sources
- var/brain_mod = 1 // % of brain damage taken from all sources
+ /// Multiplier to brute damage received.
+ /// IE: A brute mod of 0.9 = 10% less brute damage.
+ /// Only applies to damage dealt via [apply_damage][/mob/living/proc/apply_damage] unless factored in manually.
+ var/brute_mod = 1
+ /// Multiplier to burn damage received
+ var/burn_mod = 1
+ /// Multiplier to toxin damage received
+ var/tox_mod = 1
+ /// Multiplier to oxygen damage received
+ var/oxy_mod = 1
+ /// Multiplier to stamina damage received
+ var/clone_mod = 1
+ /// Multiplier to stamina damage received
+ var/stamina_mod = 1
+ /// Multiplier to brain damage received
+ var/brain_mod = 1
- var/pressure_mod = 1 // % of brute damage taken from low or high pressure (stacks with brute_mod)
- var/heat_mod = 1 // % of burn damage taken from heat (stacks with burn_mod)
- var/cold_mod = 1 // % of burn damage taken from cold (stacks with burn_mod)
+ /// Multiplier to damage taken from high / low pressure exposure, stacking with the brute modifier
+ var/pressure_mod = 1
+ /// Multiplier to damage taken from high temperature exposure, stacking with the burn modifier
+ var/heat_mod = 1
+ /// Multiplier to damage taken from low temperature exposure, stacking with the toxin modifier
+ var/cold_mod = 1
var/damage_resistance = 0 // %damage reduction from all sources
var/siemens_coeff = 1 // resistance to shocks
- var/stun_add = 0 // % additive stun increaser
- var/stun_mod = 1 // % multiplicitive stun multiplayer, applied after additive is applied
- var/bleed_mod = 1 // % bleeding modifier
- var/datum/armor/armor // internal armor datum
+ // % additive stun increaser
+ var/stun_add = 0
+ // % multiplicitive stun multiplayer, applied after additive is applied
+ var/stun_mod = 1
+ // % bleeding modifier
+ var/bleed_mod = 1
+
+ // internal armor datum
+ var/datum/armor/physio_armor
- var/hunger_mod = 1 //% of hunger rate taken per tick.
+ //% of hunger rate taken per tick.
+ var/hunger_mod = 1
/datum/physiology/New()
- armor = new
+ physio_armor = new
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 76842c3af6aee..5c55063e583b6 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -858,7 +858,7 @@
name = "pile of bandages"
desc = "It emits a strange aura, as if there was still life within it..."
max_integrity = 50
- armor = list(MELEE = 90, BULLET = 90, LASER = 25, ENERGY = 80, BOMB = 50, BIO = 100, FIRE = -50, ACID = -50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_cloth_pile
icon = 'icons/obj/items_and_weapons.dmi'
icon_state = "pile_bandages"
resistance_flags = FLAMMABLE
@@ -868,6 +868,16 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/cloth_pile)
+
+/datum/armor/structure_cloth_pile
+ melee = 90
+ bullet = 90
+ laser = 25
+ energy = 80
+ bomb = 50
+ fire = -50
+ acid = -50
+
/obj/structure/cloth_pile/Initialize(mapload, mob/living/carbon/human/H)
. = ..()
if(!QDELETED(H) && is_species(H, /datum/species/golem/cloth))
diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm
index 85d8ccb9cd4a3..ad7b5500162c8 100644
--- a/code/modules/mob/living/carbon/human/species_types/snail.dm
+++ b/code/modules/mob/living/carbon/human/species_types/snail.dm
@@ -60,10 +60,17 @@
item_state = "snailshell"
lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
- armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/backpack_snail
max_integrity = 200
resistance_flags = FIRE_PROOF | ACID_PROOF
+
+/datum/armor/backpack_snail
+ melee = 20
+ bullet = 10
+ laser = 10
+ energy = 10
+
/obj/item/storage/backpack/snail/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, "snailshell")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 00771145a2264..e182215eff8d8 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1124,10 +1124,6 @@
return TRUE
-//used in datum/reagents/reaction() proc
-/mob/living/proc/get_permeability_protection(list/target_zones)
- return 0
-
/mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering
return
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 5e575caa5da00..f5c54adb4d732 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -259,16 +259,16 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list(
if(def_zone)
if(def_zone == BODY_ZONE_HEAD)
if(inventory_head)
- return ((1 - (inventory_head.get_armor_rating(type, src) / 100)) * (1 - penetration / 100)) * 100
+ return ((1 - (inventory_head.get_armor_rating(type) / 100)) * (1 - penetration / 100)) * 100
else
if(inventory_back)
- return ((1 - (inventory_back.get_armor_rating(type, src) / 100)) * (1 - penetration / 100)) * 100
+ return ((1 - (inventory_back.get_armor_rating(type) / 100)) * (1 - penetration / 100)) * 100
return 0
else
if(inventory_head)
- armorval *= 1 - min((inventory_head.get_armor_rating(type, src) / 100) * (1 - penetration / 100), 1)
+ armorval *= 1 - min((inventory_head.get_armor_rating(type) / 100) * (1 - penetration / 100), 1)
if(inventory_back)
- armorval *= 1 - min((inventory_back.get_armor_rating(type, src) / 100) * (1 - penetration / 100), 1)
+ armorval *= 1 - min((inventory_back.get_armor_rating(type) / 100) * (1 - penetration / 100), 1)
return (1 - armorval) * 100
/mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index 65ff5920b29f5..33d41c09dc090 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -105,7 +105,7 @@
var/armorval = 0
if(head)
- armorval = ((head.get_armor_rating(type, src) / 100) * (1 - penetration / 100)) * 100
+ armorval = ((head.get_armor_rating(type) / 100) * (1 - penetration / 100)) * 100
return (armorval * get_armor_effectiveness()) //armor is reduced for tiny fragile drones
/mob/living/simple_animal/drone/proc/get_armor_effectiveness()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 6c1c66f6aaea5..c47bfa1a84049 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -114,7 +114,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
/obj/structure/elite_tumor
name = "pulsing tumor"
desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..."
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_elite_tumor
resistance_flags = INDESTRUCTIBLE
icon = 'icons/obj/lavaland/tumor.dmi'
icon_state = "tumor"
@@ -134,6 +134,18 @@ While using this makes the system rely on OnFire, it still gives options for tim
/mob/living/simple_animal/hostile/asteroid/elite/legionnaire,
/mob/living/simple_animal/hostile/asteroid/elite/herald)
+
+/datum/armor/structure_elite_tumor
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+
/obj/structure/elite_tumor/attack_hand(mob/user)
. = ..()
if(ishuman(user))
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index 16bdb8e72f7c5..2bd2eae94883f 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
integrity_failure = 0.5
max_integrity = 100
- armor = list(MELEE = 0, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_modular_computer
/// List of "connection ports" in this computer and the components with which they are plugged
var/list/all_components = list()
@@ -100,6 +100,13 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
/// If the device is capable of storing a pAI
var/can_store_pai = FALSE
+
+/datum/armor/item_modular_computer
+ bullet = 20
+ laser = 20
+ energy = 100
+ rad = 100
+
/obj/item/modular_computer/Initialize(mapload)
allowed_themes = GLOB.ntos_device_themes_default
. = ..()
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 4eb935d0f9ce8..4da8a73e7f7af 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -32,12 +32,24 @@
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 120
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ armor_type = /datum/armor/gloves_space_ninja
var/draining = 0
var/candrain = 0
var/mindrain = 200
var/maxdrain = 400
+
+/datum/armor/gloves_space_ninja
+ melee = 40
+ bullet = 30
+ laser = 20
+ energy = 15
+ bomb = 30
+ bio = 100
+ fire = 100
+ acid = 100
+
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
if(!candrain || draining)
return FALSE
diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm
index b02d10df78048..3f0ef51723fab 100644
--- a/code/modules/ninja/suit/head.dm
+++ b/code/modules/ninja/suit/head.dm
@@ -3,8 +3,22 @@
name = "ninja hood"
icon_state = "s-ninja"
item_state = "s-ninja_mask"
- armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 25, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60)
+ armor_type = /datum/armor/space_space_ninja
strip_delay = 12
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
blockTracking = TRUE//Roughly the only unique thing about this helmet.
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+
+
+/datum/armor/space_space_ninja
+ melee = 60
+ bullet = 50
+ laser = 30
+ energy = 15
+ bomb = 30
+ bio = 100
+ rad = 25
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 60
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index 6a0b16e6667c3..bae7a7d818646 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -4,12 +4,25 @@
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
icon_state = "s-ninja"
item_state = "secshoes"
- permeability_coefficient = 0.01
clothing_flags = NOSLIP
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60)
+ armor_type = /datum/armor/shoes_space_ninja
strip_delay = 120
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+
+
+/datum/armor/shoes_space_ninja
+ melee = 60
+ bullet = 50
+ laser = 30
+ energy = 15
+ bomb = 30
+ bio = 100
+ rad = 30
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 60
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 3874e9051530d..fd3c7b547396d 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -19,7 +19,7 @@ Contents:
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/stock_parts/cell)
slowdown = 1
resistance_flags = LAVA_PROOF | ACID_PROOF
- armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60)
+ armor_type = /datum/armor/space_space_ninja
strip_delay = 12
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
cell = null
@@ -66,6 +66,20 @@ Contents:
var/s_bombs = 10//Number of smoke bombs.
var/a_boost = 3//Number of adrenaline boosters.
+
+/datum/armor/space_space_ninja
+ melee = 60
+ bullet = 50
+ laser = 30
+ energy = 15
+ bomb = 30
+ bio = 100
+ rad = 30
+ fire = 100
+ acid = 100
+ stamina = 60
+ bleed = 60
+
/obj/item/clothing/suit/space/space_ninja/examine(mob/user)
. = ..()
if(s_initialized)
diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm
index 2019fceb2c707..4d613a56f304c 100644
--- a/code/modules/power/apc/apc_main.dm
+++ b/code/modules/power/apc/apc_main.dm
@@ -14,6 +14,7 @@
req_access = null
max_integrity = 200
integrity_failure = 0.25
+ damage_deflection = 10
resistance_flags = FIRE_PROOF
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON
clicksound = 'sound/machines/terminal_select.ogg'
@@ -129,11 +130,21 @@
/// To prevent sound loop bugs
var/apc_sound_stage = null
+ armor_type = /datum/armor/power_apc
+
+/datum/armor/power_apc
+ melee = 20
+ bullet = 20
+ laser = 10
+ energy = 100
+ bomb = 30
+ rad = 100
+ fire = 90
+ acid = 50
+
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
if (!req_access)
req_access = list(ACCESS_ENGINE_EQUIP)
- if (!armor)
- armor = list(MELEE = 20, BULLET = 20, LASER = 10, ENERGY = 100, BOMB = 30, BIO = 100, RAD = 100, FIRE = 90, ACID = 50, STAMINA = 0, BLEED = 0)
..()
GLOB.apcs_list += src
diff --git a/code/modules/power/apc/apc_power_proc.dm b/code/modules/power/apc/apc_power_proc.dm
index 131ae6f002564..a254de377081a 100644
--- a/code/modules/power/apc/apc_power_proc.dm
+++ b/code/modules/power/apc/apc_power_proc.dm
@@ -185,6 +185,6 @@
area.power_change()
/obj/machinery/power/apc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == MELEE && damage_amount < 10 && (!(machine_stat & BROKEN) || malfai))
- return 0
+ if(machine_stat & BROKEN)
+ return damage_amount
. = ..()
diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm
index 59770df16f9a5..a945430b9ecb1 100644
--- a/code/modules/power/lighting/light_construct.dm
+++ b/code/modules/power/lighting/light_construct.dm
@@ -6,7 +6,7 @@
anchored = TRUE
layer = WALL_OBJ_LAYER
max_integrity = 200
- armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_light_construct
var/stage = 1
var/fixture_type = "tube"
@@ -18,6 +18,14 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/light_construct)
+
+/datum/armor/structure_light_construct
+ melee = 50
+ bullet = 10
+ laser = 10
+ fire = 80
+ acid = 50
+
/obj/structure/light_construct/Initialize(mapload, ndir, building)
. = ..()
if(building)
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index d12d02585111d..64d5eb521b728 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -33,7 +33,7 @@ field_generator power level display
use_power = NO_POWER_USE
max_integrity = 500
//100% immune to lasers and energy projectiles since it absorbs their energy.
- armor = list(MELEE = 25, BULLET = 10, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/field_generator
var/power_level = 0
var/active = FG_OFFLINE
var/power = 20 // Current amount of power
@@ -44,6 +44,15 @@ field_generator power level display
var/clean_up = 0
COOLDOWN_STATIC_DECLARE(loose_message_cooldown)
+
+/datum/armor/field_generator
+ melee = 25
+ bullet = 10
+ laser = 100
+ energy = 100
+ fire = 50
+ acid = 70
+
/obj/machinery/field/generator/Initialize(mapload)
. = ..()
fields = list()
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index e93f0dcfac549..b2eaa18d3a4b9 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -23,7 +23,7 @@
anchored = FALSE
density = TRUE
max_integrity = 500
- armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_particle_accelerator
var/obj/machinery/particle_accelerator/control_box/master = null
var/construction_state = PA_CONSTRUCTION_UNSECURED
@@ -31,6 +31,14 @@
var/powered = 0
var/strength = null
+
+/datum/armor/structure_particle_accelerator
+ melee = 30
+ bullet = 20
+ laser = 20
+ fire = 90
+ acid = 80
+
/obj/structure/particle_accelerator/examine(mob/user)
. = ..()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 695ceef34eaae..9b4a08400f2fa 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -628,7 +628,7 @@
var/touch_protection = 0
if(method == VAPOR)
var/mob/living/L = A
- touch_protection = L.get_permeability_protection()
+ touch_protection = L.getarmor(null, BIO) * 0.01
R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection, affecting)
if("TURF")
R.reaction_turf(A, R.volume * volume_modifier, show_message)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 0ea618e104151..2143ba1ef9d1f 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -90,7 +90,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/touch_protection = 0
if(method == VAPOR)
var/mob/living/L = A
- touch_protection = L.get_permeability_protection()
+ touch_protection = L.getarmor(null, BIO) * 0.01
R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection)
if("TURF")
R.reaction_turf(A, R.volume * volume_modifier, show_message)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index add12c80b80ba..eafa82b4c8f10 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -227,7 +227,7 @@
if(isoozeling(M))
var/touch_mod = 0
if(method in list(TOUCH, VAPOR)) // No melting if you have skin protection
- touch_mod = M.get_permeability_protection()
+ touch_mod = M.getarmor(null, BIO) * 0.01
M.blood_volume = max(M.blood_volume - 30 * (1 - touch_mod), 0)
if(touch_mod < 0.9)
to_chat(M, "The water causes you to melt away!")
diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm
index 368a287488adc..a19d9bf724b2b 100644
--- a/code/modules/reagents/reagent_containers/cups/_cup.dm
+++ b/code/modules/reagents/reagent_containers/cups/_cup.dm
@@ -307,7 +307,7 @@
flags_inv = HIDEHAIR
slot_flags = ITEM_SLOT_HEAD
resistance_flags = NONE
- armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 50, STAMINA = 0, BLEED = 0) //Weak melee protection, because you can wear it on your head
+ armor_type = /datum/armor/cup_bucket
slot_equipment_priority = list( \
ITEM_SLOT_BACK, ITEM_SLOT_ID,\
ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\
@@ -319,6 +319,12 @@
ITEM_SLOT_DEX_STORAGE
)
+
+/datum/armor/cup_bucket
+ melee = 10
+ fire = 75
+ acid = 50
+
/obj/item/reagent_containers/cup/bucket/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/mop))
if(reagents.total_volume < 1)
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index 41809a81de167..a6e0797045fab 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -5,7 +5,7 @@
/obj/machinery/disposal
icon = 'icons/obj/atmospherics/pipes/disposal.dmi'
density = TRUE
- armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_disposal
max_integrity = 200
resistance_flags = FIRE_PROOF
interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON
@@ -28,6 +28,16 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/machinery/disposal)
+
+/datum/armor/machinery_disposal
+ melee = 25
+ bullet = 10
+ laser = 10
+ energy = 100
+ rad = 100
+ fire = 90
+ acid = 30
+
/obj/machinery/disposal/Initialize(mapload, obj/structure/disposalconstruct/make_from)
. = ..()
diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm
index b16f44e2e14f3..058df1cfb8c12 100644
--- a/code/modules/recycling/disposal/pipe.dm
+++ b/code/modules/recycling/disposal/pipe.dm
@@ -9,9 +9,10 @@
obj_flags = CAN_BE_HIT | ON_BLUEPRINTS
dir = NONE // dir will contain dominant direction for junction pipes
max_integrity = 200
- armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_disposalpipe
layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
+ damage_deflection = 10
var/dpdir = NONE // bitmask of pipe directions
var/initialize_dirs = NONE // bitflags of pipe directions added on init, see \code\_DEFINES\pipe_construction.dm
var/flip_type // If set, the pipe is flippable and becomes this type when flipped
@@ -19,6 +20,16 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/disposalpipe)
+
+/datum/armor/structure_disposalpipe
+ melee = 25
+ bullet = 10
+ laser = 10
+ energy = 100
+ rad = 100
+ fire = 90
+ acid = 30
+
/obj/structure/disposalpipe/Initialize(mapload, obj/structure/disposalconstruct/make_from)
. = ..()
@@ -115,13 +126,6 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/disposalpipe)
for(var/obj/structure/disposalholder/H in src)
H.contents_explosion(severity, target)
-
-/obj/structure/disposalpipe/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
- if(damage_flag == MELEE && damage_amount < 10)
- return 0
- return ..()
-
-
//welding tool: unfasten and convert to obj/disposalconstruct
/obj/structure/disposalpipe/welder_act(mob/living/user, obj/item/I)
if(!can_be_deconstructed(user))
diff --git a/code/modules/research/nanites/nanite_programs/buffing.dm b/code/modules/research/nanites/nanite_programs/buffing.dm
index eb11675deeff4..aadebf25e1776 100644
--- a/code/modules/research/nanites/nanite_programs/buffing.dm
+++ b/code/modules/research/nanites/nanite_programs/buffing.dm
@@ -37,6 +37,11 @@
desc = "The nanites form a mesh under the host's skin, protecting them from melee and bullet impacts."
use_rate = 0.5
rogue_types = list(/datum/nanite_program/skin_decay)
+ var/datum/armor/nanite_armor = /datum/armor/hardening_armor
+
+/datum/armor/hardening_armor
+ melee = 30
+ bullet = 30
//TODO on_hit effect that turns skin grey for a moment
@@ -44,35 +49,37 @@
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.melee += 30
- H.physiology.armor.bullet += 30
+ H.physiology.physio_armor.add_other_armor(nanite_armor)
+
/datum/nanite_program/hardening/disable_passive_effect()
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.melee -= 30
- H.physiology.armor.bullet -= 30
+ H.physiology.physio_armor.subtract_other_armor(nanite_armor)
/datum/nanite_program/refractive
name = "Dermal Refractive Surface"
desc = "The nanites form a membrane above the host's skin, reducing the effect of laser and energy impacts."
use_rate = 0.50
rogue_types = list(/datum/nanite_program/skin_decay)
+ var/datum/armor/nanite_armor = /datum/armor/refractive_armor
+
+/datum/armor/refractive_armor
+ laser = 30
+ energy = 30
/datum/nanite_program/refractive/enable_passive_effect()
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.laser += 30
- H.physiology.armor.energy += 30
+ H.physiology.physio_armor.add_other_armor(nanite_armor)
/datum/nanite_program/refractive/disable_passive_effect()
. = ..()
if(ishuman(host_mob))
var/mob/living/carbon/human/H = host_mob
- H.physiology.armor.laser -= 30
- H.physiology.armor.energy -= 30
+ H.physiology.physio_armor.subtract_other_armor(nanite_armor)
/datum/nanite_program/coagulating
name = "Rapid Coagulation"
diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm
index 24aadc2457be6..a7b47538dca53 100644
--- a/code/modules/research/nanites/nanite_programs/utility.dm
+++ b/code/modules/research/nanites/nanite_programs/utility.dm
@@ -262,7 +262,7 @@
COOLDOWN_START(src, spread_cooldown, 2 SECONDS)
return
var/mob/living/infectee = pick(target_hosts)
- if(prob(100 - (infectee.get_permeability_protection() * 100)))
+ if(prob(100 - (infectee.getarmor(null, BIO))))
COOLDOWN_START(src, spread_cooldown, 7.5 SECONDS)
//this will potentially take over existing nanites!
infectee.AddComponent(/datum/component/nanites, 10)
@@ -291,7 +291,7 @@
consume_nanites(-5)
return
var/mob/living/infectee = pick(target_hosts)
- if(prob(100 - (infectee.get_permeability_protection() * 100)))
+ if(prob(100 - (infectee.getarmor(null, BIO))))
//unlike with Infective Exo-Locomotion, this can't take over existing nanites, because Nanite Sting only targets non-hosts.
infectee.AddComponent(/datum/component/nanites, 5)
SEND_SIGNAL(infectee, COMSIG_NANITE_SYNC, nanites)
diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
index 310412685da39..6866dfe45e168 100644
--- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
@@ -13,10 +13,14 @@ Slimecrossing Armor
body_parts_covered = NONE
w_class = WEIGHT_CLASS_SMALL
gas_transfer_coefficient = 0
- permeability_coefficient = 0.5
+ armor_type = /datum/armor/mask_nobreath
flags_cover = MASKCOVERSMOUTH
resistance_flags = NONE
+
+/datum/armor/mask_nobreath
+ bio = 50
+
/obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot)
. = ..()
if(slot == ITEM_SLOT_MASK)
diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm
index 8fee94597f33f..b0395579c9401 100644
--- a/code/modules/research/xenobiology/crossbreeding/_misc.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm
@@ -147,7 +147,17 @@ Slimecrossing Items
icon_state = "frozen"
density = TRUE
max_integrity = 100
- armor = list(MELEE = 30, BULLET = 50, LASER = -50, ENERGY = -50, BOMB = 0, BIO = 100, RAD = 100, FIRE = -80, ACID = 30, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/structure_ice_stasis
+
+
+/datum/armor/structure_ice_stasis
+ melee = 30
+ bullet = 50
+ laser = -50
+ energy = -50
+ rad = 100
+ fire = -80
+ acid = 30
/obj/structure/ice_stasis/Initialize(mapload)
. = ..()
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index fec1e618944fe..62c196fb254e4 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -67,7 +67,7 @@ Slimecrossing Weapons
icon_state = "adamshield"
item_state = "adamshield"
w_class = WEIGHT_CLASS_HUGE
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 70, BLEED = 0)
+ armor_type = /datum/armor/shield_adamantineshield
slot_flags = ITEM_SLOT_BACK
attack_weight = 2
block_power = 75
@@ -80,6 +80,16 @@ Slimecrossing Weapons
attack_verb_simple = list("bash", "pound", "slam")
item_flags = SLOWS_WHILE_IN_HAND
+
+/datum/armor/shield_adamantineshield
+ melee = 50
+ bullet = 50
+ laser = 50
+ bomb = 30
+ fire = 80
+ acid = 70
+ stamina = 70
+
/obj/item/shield/adamantineshield/ComponentInitialize()
. = ..()
AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15)
diff --git a/code/modules/research/xenobiology/crossbreeding/warping.dm b/code/modules/research/xenobiology/crossbreeding/warping.dm
index 882740220e0b9..eff700d090aaf 100644
--- a/code/modules/research/xenobiology/crossbreeding/warping.dm
+++ b/code/modules/research/xenobiology/crossbreeding/warping.dm
@@ -379,10 +379,23 @@ GLOBAL_DATUM(blue_storage, /obj/item/storage/backpack/holding/bluespace)
/obj/item/storage/backpack/holding/bluespace
name = "warped rune"
anchored = TRUE
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 0)
+ armor_type = /datum/armor/holding_bluespace
invisibility = INVISIBILITY_ABSTRACT
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
+
+/datum/armor/holding_bluespace
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ bomb = 100
+ bio = 100
+ rad = 100
+ fire = 100
+ acid = 100
+ stamina = 100
+
/obj/item/slimecross/warping/bluespace
colour = "bluespace"
runepath = /obj/effect/warped_rune/bluespace
diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm
index 364ffb0272bef..abe35edba0018 100644
--- a/code/modules/ruins/lavalandruin_code/puzzle.dm
+++ b/code/modules/ruins/lavalandruin_code/puzzle.dm
@@ -296,7 +296,18 @@
//Some armor so it's harder to kill someone by mistake.
/obj/structure/puzzle_element/prison
- armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/puzzle_element_prison
+
+
+/datum/armor/puzzle_element_prison
+ melee = 50
+ bullet = 50
+ laser = 50
+ energy = 50
+ bomb = 50
+ rad = 50
+ fire = 50
+ acid = 50
/obj/structure/puzzle_element/prison/relaymove(mob/living/user, direction)
return
diff --git a/code/modules/security/genpop.dm b/code/modules/security/genpop.dm
index e6947da6bc654..9d1ad56ea795b 100644
--- a/code/modules/security/genpop.dm
+++ b/code/modules/security/genpop.dm
@@ -13,7 +13,7 @@
max_integrity = 600
integrity_failure = 0.35
//Robust! It'll be tough to break...
- armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 80, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50, "stamina" = 0)
+ armor_type = /datum/armor/machinery_turnstile
anchored = TRUE
idle_power_usage = 2
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
@@ -25,6 +25,17 @@
circuit = /obj/item/circuitboard/machine/turnstile
var/state = TURNSTILE_SECURED
+
+/datum/armor/machinery_turnstile
+ melee = 50
+ bullet = 20
+ energy = 80
+ bomb = 10
+ bio = 100
+ rad = 100
+ fire = 90
+ acid = 50
+
/obj/item/circuitboard/machine/turnstile
name = "Turnstile circuitboard"
desc = "The circuit board for a turnstile machine."
diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
index f5d43913b4b02..5631e7fd3ed61 100644
--- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
+++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm
@@ -25,7 +25,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
throw_range = 5
w_class = WEIGHT_CLASS_TINY
req_access_txt = "11"
- armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/item_shuttle_creator
resistance_flags = FIRE_PROOF
var/ready = TRUE
//pre-designation
@@ -42,6 +42,11 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He
var/turf/recorded_origin //The last remembered location of our airlock
var/turf/exit //Record the exterior turf next to the airlock to prevent modification designation
+
+/datum/armor/item_shuttle_creator
+ fire = 100
+ acid = 50
+
/obj/item/shuttle_creator/Initialize(mapload)
. = ..()
internal_shuttle_creator = new()
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 328e24016033a..6a8bf96075e3f 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -12,6 +12,7 @@
#include "anchored_mobs.dm"
#include "antag_datums.dm"
#include "area_contents.dm"
+#include "armor_verification.dm"
#include "armour_checks.dm"
#include "asset_smart_cache.dm"
#include "async.dm"
diff --git a/code/modules/unit_tests/armor_verification.dm b/code/modules/unit_tests/armor_verification.dm
new file mode 100644
index 0000000000000..14fc3dfa905c3
--- /dev/null
+++ b/code/modules/unit_tests/armor_verification.dm
@@ -0,0 +1,33 @@
+/// Verifies that armor procs are working as expected
+/datum/unit_test/armor_verification
+
+/datum/unit_test/armor_verification/Run()
+ var/obj/dummy = allocate(/obj)
+
+ dummy.set_armor(/datum/armor/none)
+ var/datum/armor/armor = dummy.get_armor()
+ TEST_ASSERT_NOTNULL(armor, "armor didn't populate correctly when needed")
+ TEST_ASSERT_EQUAL(armor_totals(armor), 0, "none armor type had armor values")
+
+ armor = armor.generate_new_with_specific(list(FIRE = 20))
+ TEST_ASSERT_EQUAL(armor_totals(armor), 20, "modified armor type had incorrect values")
+
+ armor = armor.generate_new_with_specific(list(ACID = 20))
+ TEST_ASSERT_EQUAL(armor_totals(armor), 40, "modified armor type had incorrect values")
+
+ armor = get_armor_by_type(/datum/armor/immune)
+ var/totals = armor_totals(armor)
+ armor = armor.generate_new_with_multipliers(list(ARMOR_ALL = 0))
+ TEST_ASSERT_EQUAL(armor_totals(armor), totals, "modified an immune armor type")
+
+ var/wanted = 40
+ dummy.set_armor(/datum/armor/none)
+ dummy.set_armor_rating(ENERGY, wanted * 0.5)
+ dummy.set_armor_rating(FIRE, wanted * 0.5)
+ TEST_ASSERT_EQUAL(armor_totals(dummy.get_armor()), wanted, "modified armor type had incorrect values")
+
+/datum/unit_test/armor_verification/proc/armor_totals(datum/armor/armor)
+ var/total = 0
+ for(var/key in ARMOR_LIST_ALL)
+ total += armor.vars[key]
+ return total
diff --git a/code/modules/unit_tests/armour_checks.dm b/code/modules/unit_tests/armour_checks.dm
index 95b64516a4053..9f636be0a6670 100644
--- a/code/modules/unit_tests/armour_checks.dm
+++ b/code/modules/unit_tests/armour_checks.dm
@@ -6,12 +6,10 @@
// Test without armour
TEST_ASSERT_EQUAL(STANDARDISE_ARMOUR(0), round(test_dummy.run_armor_check(), 1), "Mob with no armour returned an armour value.")
// Give the mob some armour
- var/obj/item/clothing/suit/test_vest/armor50 = new /obj/item/clothing/suit/test_vest(spawn_loc, list(MELEE = 50))
- var/armor100 = new /obj/item/clothing/suit/test_vest(spawn_loc, list(MELEE = 100))
- var/armor200 = new /obj/item/clothing/suit/test_vest(spawn_loc, list(MELEE = 200))
- var/armorN50 = new /obj/item/clothing/suit/test_vest(spawn_loc, list(MELEE = -50))
- if (armor50.armor.melee != 50)
- TEST_FAIL("Armour 50 did not have the correct armour applied to it. This is an error with the unit test.")
+ var/obj/item/clothing/suit/test_vest/armor50 = new /obj/item/clothing/suit/test_vest(spawn_loc, 50)
+ var/armor100 = new /obj/item/clothing/suit/test_vest(spawn_loc, 100)
+ var/armor200 = new /obj/item/clothing/suit/test_vest(spawn_loc, 200)
+ var/armorN50 = new /obj/item/clothing/suit/test_vest(spawn_loc, -50)
// Run armour checks again without penetration
equip_item(test_dummy, armor50)
TEST_ASSERT_EQUAL(STANDARDISE_ARMOUR(50), round(test_dummy.run_armor_check(BODY_ZONE_CHEST, MELEE), 1), "Mob wearing 50 armour vest did not return 50 armour.")
@@ -34,7 +32,7 @@
// Accept this as a valid answer
TEST_ASSERT_EQUAL(STANDARDISE_ARMOUR(-10), round(test_dummy.run_armor_check(BODY_ZONE_CHEST, MELEE, armour_penetration = 80), 1), "Mob wearing -50 armour vest returned a strange value when 80% armour penetration was applied. ([test_dummy.run_armor_check(BODY_ZONE_CHEST, MELEE, armour_penetration = 80)])")
// Test stacking armour
- var/obj/item/clothing/suit/test_vest/suit50 = new /obj/item/clothing/suit/test_vest(spawn_loc, list(MELEE = 50))
+ var/obj/item/clothing/suit/test_vest/suit50 = new /obj/item/clothing/suit/test_vest(spawn_loc, 50)
test_dummy.equip_to_slot_if_possible(suit50, ITEM_SLOT_ICLOTHING)
ADD_TRAIT(suit50, TRAIT_NODROP, INNATE_TRAIT)
@@ -78,5 +76,17 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/item/clothing/suit/test_vest)
/obj/item/clothing/suit/test_vest/Initialize(mapload, armour_values)
- armor = armour_values
+ set_armor_rating(MELEE, armour_values)
. = ..()
+
+/datum/armor/armor50
+ melee = 50
+
+/datum/armor/armor100
+ melee = 100
+
+/datum/armor/armor200
+ melee = 200
+
+/datum/armor/armorN50
+ melee = -50
diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm
index 6a41365f0ca2b..cbc9db7a08d18 100644
--- a/code/modules/vehicles/_vehicle.dm
+++ b/code/modules/vehicles/_vehicle.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/vehicles.dmi'
icon_state = "error"
max_integrity = 300
- armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/obj_vehicle
density = TRUE
anchored = FALSE
COOLDOWN_DECLARE(cooldown_vehicle_move)
@@ -25,6 +25,15 @@
var/obj/vehicle/trailer
var/are_legs_exposed = FALSE
+
+/datum/armor/obj_vehicle
+ melee = 30
+ bullet = 30
+ laser = 30
+ bomb = 30
+ fire = 60
+ acid = 60
+
/obj/vehicle/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /obj/item)) //thrown objects and projectiles bypass vehicles
return 1
diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm
index 1c674b0c1b940..742c96b1fc83c 100644
--- a/code/modules/vehicles/atv.dm
+++ b/code/modules/vehicles/atv.dm
@@ -4,11 +4,20 @@
desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-Earth technologies that are still relevant on most planet-bound outposts."
icon_state = "atv"
max_integrity = 150
- armor = list(MELEE = 50, BULLET = 25, LASER = 20, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/ridden_atv
key_type = /obj/item/key
integrity_failure = 0.5
var/static/mutable_appearance/atvcover
+
+/datum/armor/ridden_atv
+ melee = 50
+ bullet = 25
+ laser = 20
+ bomb = 50
+ fire = 60
+ acid = 60
+
/obj/vehicle/ridden/atv/Initialize(mapload)
. = ..()
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index c382fc7de1363..30406adee46f2 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -3,7 +3,7 @@
desc = "How someone could even fit in there is beyond me."
icon_state = "clowncar"
max_integrity = 150
- armor = list(MELEE = 70, BULLET = 40, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/car_clowncar
enter_delay = 20
max_occupants = 50
movedelay = 0.6
@@ -17,6 +17,15 @@
var/cannonmode = FALSE
var/cannonbusy = FALSE
+
+/datum/armor/car_clowncar
+ melee = 70
+ bullet = 40
+ laser = 40
+ bomb = 30
+ fire = 80
+ acid = 80
+
/obj/vehicle/sealed/car/clowncar/generate_actions()
. = ..()
initialize_controller_action_type(/datum/action/vehicle/sealed/horn/clowncar, VEHICLE_CONTROL_DRIVE)
diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm
index 601b44e634860..65efb2b0ac624 100644
--- a/code/modules/vehicles/mecha/_mecha.dm
+++ b/code/modules/vehicles/mecha/_mecha.dm
@@ -23,7 +23,7 @@
icon = 'icons/mecha/mecha.dmi'
resistance_flags = FIRE_PROOF | ACID_PROOF
max_integrity = 300
- armor = list(MELEE = 20, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0)
+ armor_type = /datum/armor/sealed_mecha
movedelay = 1 SECONDS
force = 5
move_force = MOVE_FORCE_VERY_STRONG
@@ -178,6 +178,14 @@
hud_possible = list (DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD)
+
+/datum/armor/sealed_mecha
+ melee = 20
+ bullet = 10
+ bomb = 10
+ fire = 100
+ acid = 100
+
/obj/item/radio/mech //this has to go somewhere
subspace_transmission = TRUE
@@ -313,9 +321,9 @@
normal_step_energy_drain = 500
step_energy_drain = normal_step_energy_drain
if(capacitor)
- armor = armor.modifyRating(energy = (capacitor.rating * 5)) //Each level of capacitor protects the mech against emp by 5%
- else //because we can still be hit without a cap, even if we can't move
- armor = armor.setRating(energy = 0)
+ var/datum/armor/stock_armor = get_armor_by_type(armor_type)
+ var/initial_energy = stock_armor.get_rating(ENERGY)
+ set_armor_rating(ENERGY, initial_energy + (capacitor.rating * 5))
////////////////////////
diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm
index dd3c7f9beda67..3690f9a4feb04 100644
--- a/code/modules/vehicles/mecha/combat/combat.dm
+++ b/code/modules/vehicles/mecha/combat/combat.dm
@@ -2,11 +2,21 @@
force = 30
internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY)
internal_damage_threshold = 50
- armor = list(MELEE = 30, BULLET = 30, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/mecha_combat
mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
destruction_knockdown_duration = 8 SECONDS
exit_delay = 40
+
+/datum/armor/mecha_combat
+ melee = 30
+ bullet = 30
+ laser = 15
+ energy = 20
+ bomb = 20
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/restore_equipment()
mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
return ..()
diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm
index fc3cd7d44734f..1f688bb662123 100644
--- a/code/modules/vehicles/mecha/combat/durand.dm
+++ b/code/modules/vehicles/mecha/combat/durand.dm
@@ -7,13 +7,24 @@
dir_in = 1 //Facing North.
max_integrity = 400
deflect_chance = 20
- armor = list(MELEE = 40, BULLET = 35, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/combat_durand
max_temperature = 30000
force = 40
wreckage = /obj/structure/mecha_wreckage/durand
var/obj/durand_shield/shield
+
+/datum/armor/combat_durand
+ melee = 40
+ bullet = 35
+ laser = 15
+ energy = 10
+ bomb = 20
+ rad = 50
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/durand/Initialize(mapload)
. = ..()
shield = new /obj/durand_shield(loc, src, layer, dir)
diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm
index ecdb3406b4cb6..58088f100be2e 100644
--- a/code/modules/vehicles/mecha/combat/gygax.dm
+++ b/code/modules/vehicles/mecha/combat/gygax.dm
@@ -7,7 +7,7 @@
dir_in = 1 //Facing North.
max_integrity = 250
deflect_chance = 5
- armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/combat_gygax
max_temperature = 25000
leg_overload_coeff = 80
force = 25
@@ -16,6 +16,15 @@
max_equip = 3
step_energy_drain = 3
+
+/datum/armor/combat_gygax
+ melee = 25
+ bullet = 20
+ laser = 30
+ energy = 15
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/gygax/dark
desc = "A lightweight exosuit, painted in a dark scheme. This model appears to have some modifications."
name = "\improper Dark Gygax"
@@ -23,7 +32,7 @@
base_icon_state = "darkgygax"
max_integrity = 300
deflect_chance = 15
- armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/gygax_dark
max_temperature = 35000
leg_overload_coeff = 70
operation_req_access = list(ACCESS_SYNDICATE)
@@ -32,6 +41,17 @@
max_equip = 5
destruction_knockdown_duration = 2 SECONDS //Syndi mechs get reduced knockdown
+
+/datum/armor/gygax_dark
+ melee = 40
+ bullet = 40
+ laser = 50
+ energy = 35
+ bomb = 20
+ rad = 20
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/gygax/dark/loaded/Initialize(mapload)
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/thrusters/ion(src)
diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm
index 7648a9dd0a713..9be4951b5b41d 100644
--- a/code/modules/vehicles/mecha/combat/honker.dm
+++ b/code/modules/vehicles/mecha/combat/honker.dm
@@ -7,7 +7,7 @@
max_integrity = 140
deflect_chance = 60
internal_damage_threshold = 60
- armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/combat_honker
max_temperature = 25000
operation_req_access = list(ACCESS_THEATRE)
internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE)
@@ -16,6 +16,12 @@
max_equip = 3
var/squeak = 0
+
+/datum/armor/combat_honker
+ melee = -20
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/honker/get_stats_part(mob/user)
var/integrity = atom_integrity/max_integrity*100
var/cell_charge = get_charge()
@@ -187,13 +193,23 @@
icon_state = "darkhonker"
max_integrity = 300
deflect_chance = 15
- armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/honker_dark
max_temperature = 35000
operation_req_access = list(ACCESS_SYNDICATE)
internals_req_access = list(ACCESS_SYNDICATE)
wreckage = /obj/structure/mecha_wreckage/honker/dark
max_equip = 4
+
+/datum/armor/honker_dark
+ melee = 40
+ bullet = 40
+ laser = 50
+ energy = 35
+ bomb = 20
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/honker/dark/add_cell(obj/item/stock_parts/cell/C)
if(C)
C.forceMove(src)
diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm
index 147aaa7a6d291..d25d0d9762370 100644
--- a/code/modules/vehicles/mecha/combat/marauder.dm
+++ b/code/modules/vehicles/mecha/combat/marauder.dm
@@ -6,7 +6,7 @@
movedelay = 5
max_integrity = 500
deflect_chance = 25
- armor = list(MELEE = 50, BULLET = 55, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 60, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/combat_marauder
max_temperature = 60000
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
operation_req_access = list(ACCESS_CENT_SPECOPS)
@@ -18,6 +18,17 @@
max_equip = 5
bumpsmash = TRUE
+
+/datum/armor/combat_marauder
+ melee = 50
+ bullet = 55
+ laser = 40
+ energy = 30
+ bomb = 30
+ rad = 60
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/marauder/generate_actions()
. = ..()
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_smoke)
diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm
index af921d340fa0e..8d93ad2c0e909 100644
--- a/code/modules/vehicles/mecha/combat/phazon.dm
+++ b/code/modules/vehicles/mecha/combat/phazon.dm
@@ -8,7 +8,7 @@
step_energy_drain = 3
max_integrity = 200
deflect_chance = 30
- armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/combat_phazon
max_temperature = 25000
wreckage = /obj/structure/mecha_wreckage/phazon
internal_damage_threshold = 25
@@ -16,6 +16,17 @@
max_equip = 3
phase_state = "phazon-phase"
+
+/datum/armor/combat_phazon
+ melee = 30
+ bullet = 30
+ laser = 30
+ energy = 30
+ bomb = 30
+ rad = 50
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/phazon/generate_actions()
. = ..()
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_phasing)
diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm
index 420133de3861a..2d17d661501cd 100644
--- a/code/modules/vehicles/mecha/combat/reticence.dm
+++ b/code/modules/vehicles/mecha/combat/reticence.dm
@@ -7,7 +7,7 @@
dir_in = 1 //Facing North.
max_integrity = 100
deflect_chance = 3
- armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/combat_reticence
max_temperature = 15000
wreckage = /obj/structure/mecha_wreckage/reticence
operation_req_access = list(ACCESS_THEATRE)
@@ -18,6 +18,15 @@
step_energy_drain = 3
color = "#87878715"
+
+/datum/armor/combat_reticence
+ melee = 25
+ bullet = 20
+ laser = 30
+ energy = 15
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/combat/reticence/loaded/Initialize(mapload)
. = ..()
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm
index 9590c536310b3..7fa2dee48e11e 100644
--- a/code/modules/vehicles/mecha/working/clarke.dm
+++ b/code/modules/vehicles/mecha/working/clarke.dm
@@ -11,7 +11,7 @@
lights_power = 7
deflect_chance = 10
step_energy_drain = 15 //slightly higher energy drain since you movin those wheels FAST
- armor = list(MELEE = 20, BULLET = 10, LASER = 20, ENERGY = 10, BOMB = 60, BIO = 0, RAD = 70, FIRE = 100, ACID = 100) //low armor to compensate for fire protection and speed
+ armor_type = /datum/armor/working_clarke
max_equip = 7
wreckage = /obj/structure/mecha_wreckage/clarke
enter_delay = 40
@@ -20,6 +20,17 @@
allow_diagonal_movement = FALSE
pivot_step = TRUE
+
+/datum/armor/working_clarke
+ melee = 20
+ bullet = 10
+ laser = 20
+ energy = 10
+ bomb = 60
+ rad = 70
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/working/clarke/Initialize(mapload)
. = ..()
box = new(src)
diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm
index 23a80f6843023..508930a9d3077 100644
--- a/code/modules/vehicles/mecha/working/ripley.dm
+++ b/code/modules/vehicles/mecha/working/ripley.dm
@@ -13,7 +13,7 @@
max_integrity = 200
lights_power = 7
deflect_chance = 15
- armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/working_ripley
max_equip = 6
wreckage = /obj/structure/mecha_wreckage/ripley
internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING)
@@ -30,6 +30,17 @@
stepsound = 'sound/mecha/powerloader_step.ogg'
turnsound = 'sound/mecha/powerloader_turn2.ogg'
+
+/datum/armor/working_ripley
+ melee = 40
+ bullet = 20
+ laser = 10
+ energy = 20
+ bomb = 40
+ rad = 20
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/working/ripley/Move()
. = ..()
update_pressure()
@@ -66,12 +77,22 @@
fast_pressure_step_in = 1.75 //step_in while in low pressure conditions
slow_pressure_step_in = 3 //step_in while in normal pressure conditions
movedelay = 4
- armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/ripley_mk2
wreckage = /obj/structure/mecha_wreckage/ripley/mk2
enclosed = TRUE
enter_delay = 40
silicon_icon_state = null
+
+/datum/armor/ripley_mk2
+ melee = 40
+ bullet = 20
+ laser = 10
+ energy = 20
+ bomb = 40
+ fire = 100
+ acid = 100
+
/obj/vehicle/sealed/mecha/working/ripley/mk2/generate_actions()
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_eject)
initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/mech_toggle_internals)
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index caa76e091fda0..b06be2a40745f 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -4,10 +4,19 @@
desc = "A brave security cyborg gave its life to help you look like a complete tool."
icon_state = "secway"
max_integrity = 100
- armor = list(MELEE = 20, BULLET = 15, LASER = 10, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/ridden_secway
key_type = /obj/item/key/security
integrity_failure = 0.5
+
+/datum/armor/ridden_secway
+ melee = 20
+ bullet = 15
+ laser = 10
+ bomb = 30
+ fire = 60
+ acid = 60
+
/obj/vehicle/ridden/secway/Initialize(mapload)
. = ..()
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm
index a8f41f4a2cba5..00fe7eb6b8672 100644
--- a/code/modules/vehicles/wheelchair.dm
+++ b/code/modules/vehicles/wheelchair.dm
@@ -5,7 +5,7 @@
icon_state = "wheelchair"
layer = OBJ_LAYER
max_integrity = 100
- armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 30, STAMINA = 0, BLEED = 0) //Wheelchairs aren't super tough yo
+ armor_type = /datum/armor/ridden_wheelchair
legs_required = 0 //You'll probably be using this if you don't have legs
canmove = TRUE
density = FALSE //Thought I couldn't fix this one easily, phew
@@ -13,6 +13,15 @@
// Run speed delay is multiplied with this for vehicle move delay.
var/delay_multiplier = 6.7
+
+/datum/armor/ridden_wheelchair
+ melee = 10
+ bullet = 10
+ laser = 10
+ bomb = 10
+ fire = 20
+ acid = 30
+
/obj/vehicle/ridden/wheelchair/Initialize(mapload)
. = ..()
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 5205ca62bfb60..947d4163f75b9 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -59,7 +59,7 @@
verb_exclaim = "beeps"
max_integrity = 300
integrity_failure = 0.33
- armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/machinery_vending
circuit = /obj/item/circuitboard/machine/vendor
clicksound = 'sound/machines/pda_button1.ogg'
dept_req_for_free = ACCOUNT_SRV_BITFLAG
@@ -180,6 +180,12 @@
///Name of lighting mask for the vending machine
var/light_mask
+
+/datum/armor/machinery_vending
+ melee = 20
+ fire = 50
+ acid = 70
+
/obj/item/circuitboard
///determines if the circuit board originated from a vendor off station or not.
var/onstation = TRUE
diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm
index fe317ec612061..57866ff682c04 100644
--- a/code/modules/vending/liberation.dm
+++ b/code/modules/vending/liberation.dm
@@ -26,9 +26,17 @@
contraband = list(/obj/item/clothing/under/misc/patriotsuit = 3,
/obj/item/bedsheet/patriot = 5,
/obj/item/food/burger/superbite = 3) //U S A
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/vending_liberationstation
resistance_flags = FIRE_PROOF
default_price = 300
extra_price = 500
dept_req_for_free = ACCOUNT_SEC_BITFLAG
light_mask = "liberation-light-mask"
+
+/datum/armor/vending_liberationstation
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 50
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 9cccd0d703762..65c7d68d0da75 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -22,10 +22,19 @@
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/vending_toyliberationstation
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
default_price = 75
extra_price = 300
dept_req_for_free = ACCOUNT_SRV_BITFLAG
light_mask = "donksoft-light-mask"
+
+
+/datum/armor/vending_toyliberationstation
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 50
diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm
index 7392cebfe599b..2a2ee8705f8de 100644
--- a/code/modules/vending/magivend.dm
+++ b/code/modules/vending/magivend.dm
@@ -14,9 +14,17 @@
/obj/item/clothing/shoes/sandal/magic = 1,
/obj/item/staff = 2)
contraband = list(/obj/item/reagent_containers/cup/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/vending_magivend
resistance_flags = FIRE_PROOF
default_price = 25
extra_price = 50
dept_req_for_free = ACCOUNT_SRV_BITFLAG
light_mask = "magivend-light-mask"
+
+/datum/armor/vending_magivend
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 50
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index f8ba4d5332202..58c66b67b4897 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -25,13 +25,15 @@
contraband = list(/obj/item/reagent_containers/cup/bottle/chloralhydrate = 1,
/obj/item/storage/box/hug/medical = 1,
/obj/item/reagent_containers/cup/bottle/random_virus = 1)
- premium = list(/obj/item/storage/firstaid/regular = 3,
- /obj/item/storage/belt/medical = 3,
- /obj/item/sensor_device = 2,
- /obj/item/pinpointer/crew = 2,
- /obj/item/healthanalyzer = 2,
- /obj/item/wrench/medical = 1)
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ premium = list(
+ /obj/item/storage/firstaid/regular = 3,
+ /obj/item/storage/belt/medical = 3,
+ /obj/item/sensor_device = 2,
+ /obj/item/pinpointer/crew = 2,
+ /obj/item/healthanalyzer = 2,
+ /obj/item/wrench/medical = 1
+ )
+ armor_type = /datum/armor/vending_medical
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/medical
default_price = 25
@@ -39,6 +41,14 @@
dept_req_for_free = ACCOUNT_MED_BITFLAG
light_mask = "med-light-mask"
+/datum/armor/vending_medical
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 50
+
/obj/item/vending_refill/medical
machine_name = "NanoMed Plus"
icon_state = "refill_medical"
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index aaa9597a4b248..aa84964fc1ab8 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -13,7 +13,7 @@
/obj/item/reagent_containers/medspray/sterilizine = 3)
contraband = list(/obj/item/reagent_containers/cup/bottle/toxin = 1,
/obj/item/reagent_containers/cup/bottle/morphine = 1)
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/vending_wallmed
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/wallmed
default_price = 25
@@ -24,6 +24,14 @@
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/vending/wallmed, 32)
+/datum/armor/vending_wallmed
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 50
+
/obj/item/vending_refill/wallmed
machine_name = "NanoMed"
icon_state = "refill_medical"
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index e43d014bf1ea4..19433eeb5a041 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -24,13 +24,21 @@
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5)
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/vending_donksofttoyvendor
resistance_flags = FIRE_PROOF
refill_canister = /obj/item/vending_refill/donksoft
default_price = 75
extra_price = 300
dept_req_for_free = ACCOUNT_SRV_BITFLAG
+/datum/armor/vending_donksofttoyvendor
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 50
+
/obj/item/vending_refill/donksoft
machine_name = "Donksoft Toy Vendor"
icon_state = "refill_donksoft"
diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm
index f7dc223092cbe..d52d4dd0cff2b 100644
--- a/code/modules/vending/youtool.dm
+++ b/code/modules/vending/youtool.dm
@@ -23,12 +23,20 @@
/obj/item/clothing/head/utility/welding = 2,
/obj/item/clothing/gloves/color/yellow = 1)
refill_canister = /obj/item/vending_refill/tool
- armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0)
+ armor_type = /datum/armor/vending_tool
resistance_flags = FIRE_PROOF
default_price = 10
extra_price = 80
dept_req_for_free = ACCOUNT_ENG_BITFLAG
+/datum/armor/vending_tool
+ melee = 100
+ bullet = 100
+ laser = 100
+ energy = 100
+ fire = 100
+ acid = 70
+
/obj/item/vending_refill/tool
machine_name = "YouTool"
icon_state = "refill_engi"