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"