diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
index 3d6285412367c..625c667547c0a 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm
@@ -1,842 +1,925 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aa" = (
-/turf/template_noop,
-/area/template_noop)
-"ab" = (
+"an" = (
+/obj/structure/ore_box,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"at" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ac" = (
-/obj/structure/stone_tile/block{
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"aw" = (
+/obj/structure/stone_tile/cracked{
dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ad" = (
/obj/structure/stone_tile/block{
- dir = 1
- },
-/obj/structure/stone_tile/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ae" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 1
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"af" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"bs" = (
/obj/structure/stone_tile/block{
- dir = 1
+ dir = 4
},
/obj/structure/stone_tile{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ag" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ah" = (
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ai" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 4
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"aj" = (
-/obj/structure/stone_tile/slab,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ak" = (
-/turf/closed/indestructible/riveted/boss,
-/area/ruin/unpowered/ash_walkers)
-"al" = (
-/obj/structure/stone_tile/surrounding_tile{
- dir = 1
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"am" = (
/obj/structure/stone_tile{
dir = 4
},
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/item/stack/marker_beacon/ten,
-/obj/item/seeds/tobacco/lavaland,
+/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"aq" = (
-/obj/structure/stone_tile/block/cracked{
+"bu" = (
+/obj/structure/stone_tile/block/cracked,
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"bE" = (
+/obj/structure/stone_tile/block{
dir = 8
},
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ar" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 4
- },
+/obj/structure/stone_tile,
/obj/structure/stone_tile{
- dir = 4
+ dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"as" = (
-/turf/closed/wall/mineral/wood,
+/obj/structure/table/wood,
+/obj/item/spear/bonespear,
+/obj/item/storage/belt/mining/primitive,
+/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"at" = (
+"bG" = (
+/obj/structure/closet/crate/wooden,
/obj/structure/stone_tile/block{
dir = 8
},
-/obj/structure/stone_tile/block{
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"cg" = (
+/obj/structure/stone_tile/block/cracked{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"au" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile/cracked{
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"cK" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"cO" = (
+/obj/structure/stone_tile/surrounding_tile{
dir = 4
},
-/obj/structure/stone_tile/cracked{
+/obj/structure/stone_tile/center/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 1
},
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"cR" = (
/obj/item/flashlight/lantern,
-/turf/open/indestructible/boss,
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"av" = (
-/obj/structure/stone_tile/block,
-/obj/structure/stone_tile{
+"ec" = (
+/obj/structure/stone_tile/block{
dir = 1
},
+/obj/structure/stone_tile/cracked,
/obj/structure/stone_tile{
- dir = 4
+ dir = 8
},
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"aw" = (
-/obj/structure/stone_tile/block,
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/stone_tile{
+"ei" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/effect/decal/cleanable/blood,
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"ax" = (
-/obj/structure/stone_tile/block,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/structure/stone_tile{
+"ey" = (
+/turf/closed/mineral/volcanic/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"eO" = (
+/obj/structure/stone_tile/surrounding_tile,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"eR" = (
+/obj/structure/stone_tile/block{
dir = 4
},
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"ay" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 1
- },
+"fb" = (
/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/block/cracked{
dir = 4
},
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"fn" = (
/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/item/flashlight/lantern,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"az" = (
-/obj/structure/stone_tile/block{
- dir = 4
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
},
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"fs" = (
/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"aA" = (
-/obj/structure/stone_tile/cracked{
- dir = 8
+/area/ruin/unpowered/ash_walkers)
+"fv" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aB" = (
-/obj/structure/stone_tile/block/cracked,
-/obj/structure/stone_tile{
+"fx" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/cracked{
dir = 4
},
+/obj/structure/table/wood,
+/obj/item/knife/combat/bone{
+ pixel_y = 11;
+ pixel_x = 5
+ },
+/obj/item/screwdriver{
+ pixel_y = 2;
+ pixel_x = 9
+ },
+/obj/item/wirecutters{
+ pixel_y = 4;
+ pixel_x = -5
+ },
+/obj/item/crowbar{
+ pixel_y = -10
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aC" = (
-/obj/structure/stone_tile/block/cracked,
-/obj/item/storage/toolbox/syndicate,
+"gQ" = (
+/obj/item/spear/bonespear,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aE" = (
-/obj/structure/stone_tile{
+"hQ" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
},
-/obj/structure/closet/crate/medical,
-/obj/item/storage/firstaid/regular,
-/obj/item/reagent_containers/blood/random,
-/obj/item/reagent_containers/blood/lizard,
-/obj/item/reagent_containers/blood/lizard,
-/obj/item/stack/sheet/cotton/cloth/ten,
+/obj/structure/stone_tile/block/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aF" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"aG" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 4
- },
+"ic" = (
/obj/structure/stone_tile/cracked{
- dir = 4
+ dir = 8
},
-/obj/structure/stone_tile{
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"iA" = (
+/obj/structure/stone_tile/block{
dir = 8
},
-/turf/open/indestructible/boss,
+/turf/open/lava/smooth/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aH" = (
-/obj/structure/stone_tile/surrounding_tile/cracked,
-/obj/structure/stone_tile/center,
-/obj/structure/stone_tile/surrounding_tile{
+"js" = (
+/obj/structure/stone_tile/block{
dir = 1
},
-/obj/structure/stone_tile/surrounding_tile{
+/obj/structure/stone_tile/cracked{
dir = 8
},
-/turf/open/lava/smooth/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"aI" = (
-/obj/structure/stone_tile/block/cracked,
-/turf/open/lava/smooth/lava_land_surface,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aJ" = (
-/obj/structure/stone_tile/surrounding_tile/cracked,
-/obj/structure/stone_tile/surrounding_tile/cracked{
+"jW" = (
+/obj/structure/stone_tile/block/cracked{
dir = 4
},
-/obj/structure/stone_tile/center,
-/obj/structure/stone_tile/surrounding_tile{
+/obj/structure/stone_tile/cracked{
dir = 8
},
-/turf/open/lava/smooth/lava_land_surface,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aK" = (
+"lf" = (
+/obj/structure/stone_tile/block,
/obj/structure/stone_tile/block/cracked{
- dir = 8
- },
-/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/structure/stone_tile,
-/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,
-/turf/open/indestructible/boss,
+/obj/structure/table/optable,
+/obj/item/bedsheet/brown{
+ pixel_y = 2
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aM" = (
+"lk" = (
+/obj/structure/stone_tile/cracked,
/obj/structure/stone_tile/cracked{
- dir = 4
+ dir = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aN" = (
-/obj/structure/stone_tile{
+"mk" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block{
dir = 1
},
-/obj/item/weldingtool/experimental,
+/obj/structure/table/wood,
+/obj/item/food/meat/cutlet/grub,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aO" = (
-/obj/structure/stone_tile/surrounding/cracked{
- dir = 1;
- icon_state = "cracked_surrounding1"
+"mp" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile{
+ dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aP" = (
-/obj/structure/stone_tile,
+"mv" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/center/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aQ" = (
+"mF" = (
/obj/structure/stone_tile/block{
dir = 8
},
-/obj/machinery/iv_drip,
-/obj/item/reagent_containers/cup/glass/waterbottle/large,
+/obj/structure/stone_tile/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aR" = (
-/obj/structure/stone_tile/block{
+"nt" = (
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 8
+ },
+/obj/structure/stone_tile/center,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"nv" = (
+/obj/structure/table/wood,
+/obj/effect/mob_spawn/human/corpse/damaged,
+/obj/effect/decal/cleanable/blood,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"nW" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
},
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"nZ" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"aS" = (
-/obj/structure/stone_tile/block{
+/obj/structure/stone_tile/cracked{
dir = 4
},
/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"aT" = (
+"oq" = (
/obj/structure/stone_tile/block/cracked{
- dir = 4
+ dir = 1
},
-/turf/open/lava/smooth/lava_land_surface,
+/obj/structure/table/wood,
+/obj/item/flashlight/lantern,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aU" = (
-/obj/structure/lavaland/ash_walker,
-/turf/open/lava/smooth/lava_land_surface,
+"oN" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aV" = (
-/obj/structure/stone_tile/block{
+"pf" = (
+/obj/structure/stone_tile/cracked{
dir = 8
},
-/turf/open/lava/smooth/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"aW" = (
/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"pm" = (
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/cracked{
dir = 1
},
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"aZ" = (
-/obj/structure/stone_tile/cracked{
- dir = 4
+"pp" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/mortar{
+ pixel_y = 3;
+ pixel_x = 5
},
-/obj/structure/stone_tile{
+/obj/item/pestle{
+ pixel_y = 5;
+ pixel_x = 5
+ },
+/obj/structure/stone_tile/block{
dir = 1
},
-/obj/structure/stone_tile{
- dir = 8
+/obj/item/reagent_containers/cup/bottle{
+ pixel_y = 17;
+ pixel_x = -1
+ },
+/obj/item/reagent_containers/cup/bottle{
+ pixel_y = 13;
+ pixel_x = -8
+ },
+/obj/item/reagent_containers/cup/glass/waterbottle/relic{
+ pixel_y = 4;
+ pixel_x = -11
+ },
+/obj/item/reagent_containers/cup/glass/waterbottle/relic{
+ pixel_x = -8;
+ pixel_y = -6
},
-/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"ba" = (
-/obj/structure/stone_tile/cracked{
+"qQ" = (
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
+/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"rj" = (
/obj/structure/stone_tile{
- dir = 4
+ dir = 1
},
+/obj/structure/stone_tile/block/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bc" = (
-/obj/structure/stone_tile/block{
- dir = 4
+"sl" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
},
/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile{
- dir = 4
+/obj/structure/table/wood,
+/obj/item/hatchet,
+/obj/item/stack/cable_coil/yellow{
+ pixel_y = 9;
+ pixel_x = 6
},
-/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"bd" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 4
+/obj/item/weldingtool/mini{
+ pixel_y = -8;
+ pixel_x = -5
},
-/obj/structure/stone_tile/center/cracked,
-/obj/structure/stone_tile/surrounding_tile,
-/obj/structure/stone_tile/surrounding_tile{
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"so" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile{
dir = 1
},
-/turf/open/lava/smooth/lava_land_surface,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"be" = (
-/obj/structure/stone_tile/block{
+"sv" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/block/cracked{
dir = 1
},
-/turf/open/lava/smooth/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"bf" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 8
+/obj/structure/table/wood,
+/obj/item/food/meat/slab/human/mutant/psyphoza{
+ pixel_y = 3;
+ pixel_x = 7
},
-/obj/structure/stone_tile/center,
-/obj/structure/stone_tile/surrounding_tile{
- dir = 1
+/obj/item/food/meat/slab/goliath{
+ pixel_y = -4;
+ pixel_x = -5
},
-/obj/structure/stone_tile/surrounding_tile{
- dir = 4
+/obj/item/knife/combat/bone{
+ pixel_y = 11
},
-/turf/open/lava/smooth/lava_land_surface,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bg" = (
-/obj/structure/stone_tile/block{
+"sG" = (
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/structure/stone_tile/cracked{
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"tl" = (
+/obj/structure/stone_tile/cracked,
+/obj/structure/stone_tile/block/cracked{
dir = 1
},
-/obj/structure/stone_tile,
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bh" = (
-/obj/structure/stone_tile/block{
- dir = 4
- },
-/obj/structure/stone_tile{
+"up" = (
+/obj/structure/closet/crate/wooden,
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bi" = (
+/obj/structure/stone_tile/cracked,
+/obj/item/food/grown/mushroom/chanterelle,
+/obj/item/food/grown/mushroom/chanterelle,
+/obj/item/food/grown/ash_flora/mushroom_stem,
+/obj/item/food/grown/ash_flora/mushroom_stem,
+/obj/item/food/grown/ash_flora/mushroom_stem,
+/obj/item/food/grown/ash_flora/mushroom_leaf,
+/obj/item/food/grown/ash_flora/mushroom_leaf,
+/obj/item/food/grown/ash_flora/mushroom_leaf,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"uv" = (
/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bj" = (
-/obj/structure/stone_tile/block/cracked{
+/obj/structure/stone_tile{
dir = 4
},
+/obj/structure/table/wood,
+/obj/item/storage/box/matches{
+ pixel_y = 16
+ },
+/obj/item/hacksaw,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"wv" = (
+/obj/structure/stone_tile,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"wC" = (
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked,
/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile/cracked{
+/obj/structure/table/wood,
+/obj/item/spear/bonespear,
+/obj/item/storage/belt/quiver,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/ammo_casing/caseless/arrow/bone,
+/obj/item/gun/ballistic/bow/ashen,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"xs" = (
+/obj/structure/stone_tile/block{
dir = 4
},
-/obj/item/storage/bag/plants/portaseeder,
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"bl" = (
-/obj/structure/stone_tile/cracked{
- dir = 1
+"xz" = (
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/surrounding/cracked{
+ dir = 1;
+ icon_state = "cracked_surrounding1"
},
+/obj/structure/stone_tile/center,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bm" = (
-/obj/structure/stone_tile{
- dir = 1
+"xK" = (
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
},
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
+/obj/structure/stone_tile/center,
+/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"xO" = (
/obj/structure/stone_tile/cracked{
- dir = 4
+ dir = 8
},
-/obj/item/construction/rcd/loaded,
-/turf/open/indestructible/boss,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/obj/machinery/iv_drip,
+/obj/item/reagent_containers/cup/glass/waterbottle/large,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bn" = (
-/obj/structure/closet/crate/radiation,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/flare,
-/obj/structure/stone_tile/block/cracked{
+"yl" = (
+/turf/closed/indestructible/riveted/boss,
+/area/ruin/unpowered/ash_walkers)
+"yy" = (
+/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile/cracked{
+/obj/structure/stone_tile{
dir = 1
},
+/obj/structure/stone_tile/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bo" = (
+"yz" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 4
+ },
/obj/structure/stone_tile/block{
dir = 8
},
-/obj/item/pickaxe,
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bp" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
+/area/ruin/unpowered/ash_walkers)
+"yK" = (
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/item/flashlight/lantern,
+/obj/structure/stone_tile,
+/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"bq" = (
+"yV" = (
+/obj/structure/necropolis_gate,
/obj/structure/stone_tile/block{
- dir = 1
+ dir = 4
},
-/obj/structure/stone_tile/cracked,
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
+/obj/structure/fans/tiny/invisible,
+/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"br" = (
-/obj/structure/stone_tile/slab/cracked,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"bs" = (
-/obj/structure/stone_tile/block/cracked{
+"zt" = (
+/obj/structure/stone_tile/block{
dir = 1
},
+/obj/structure/stone_tile/block/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"zv" = (
/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile,
-/obj/effect/decal/cleanable/blood,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"bt" = (
-/obj/structure/stone_tile,
/obj/structure/stone_tile{
- dir = 8
+ dir = 4
},
-/obj/structure/stone_tile{
- dir = 1
+/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Ah" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
},
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"AB" = (
+/turf/template_noop,
+/area/template_noop)
+"Bf" = (
/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/item/flashlight/lantern,
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bv" = (
-/obj/structure/stone_tile/cracked{
+"Bw" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/block{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"BC" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/center/cracked,
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/surrounding_tile{
+ dir = 1
+ },
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"BJ" = (
+/obj/structure/stone_tile/block{
dir = 8
},
-/obj/structure/closet/crate,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/restraints/handcuffs/cable/sinew,
+/obj/item/restraints/handcuffs/cable/sinew{
+ pixel_y = -10
+ },
+/obj/item/restraints/handcuffs/cable/sinew{
+ pixel_y = 5
+ },
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"Ch" = (
+/obj/machinery/the_singularitygen,
+/obj/structure/stone_tile/surrounding/cracked,
+/obj/structure/stone_tile/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bw" = (
+"CD" = (
/obj/structure/stone_tile/block{
dir = 1
},
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Dk" = (
+/obj/structure/stone_tile/block{
dir = 8
},
-/obj/item/stack/sheet/wood,
-/obj/item/stack/sheet/wood,
-/obj/item/stack/sheet/wood,
-/obj/item/stack/sheet/wood,
-/obj/item/seeds/tower,
-/obj/item/seeds/bamboo,
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"bx" = (
+"DM" = (
/obj/structure/stone_tile/slab/cracked,
-/obj/effect/decal/cleanable/blood,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"by" = (
-/obj/structure/closet/crate,
+"Ej" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/block/cracked{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Ex" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"EG" = (
/obj/structure/stone_tile/block/cracked{
dir = 1
},
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/structure/stone_tile/cracked,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/obj/item/flashlight/lantern,
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bz" = (
-/obj/structure/stone_tile{
+"EI" = (
+/obj/structure/stone_tile/cracked{
dir = 4
},
/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"EX" = (
/obj/structure/stone_tile/cracked{
- dir = 1
+ dir = 8
},
/obj/structure/stone_tile/cracked{
- dir = 8
+ dir = 1
},
-/obj/machinery/the_singularitygen,
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bA" = (
-/obj/structure/stone_tile/block{
- dir = 8
+"Fh" = (
+/obj/structure/table/wood,
+/obj/item/food/grown/ash_flora/cactus_fruit{
+ pixel_y = 5;
+ pixel_x = 4
+ },
+/obj/item/food/grown/ash_flora/cactus_fruit{
+ pixel_x = 7
+ },
+/obj/item/food/grown/ash_flora/cactus_fruit{
+ pixel_y = 1;
+ pixel_x = 2
+ },
+/obj/structure/stone_tile/surrounding/cracked,
+/obj/structure/stone_tile/cracked,
+/obj/item/food/grown/ash_flora/mushroom_leaf{
+ pixel_y = 10;
+ pixel_x = -5
+ },
+/obj/item/food/grown/ash_flora/mushroom_leaf{
+ pixel_y = 9;
+ pixel_x = -11
+ },
+/obj/item/food/grown/ash_flora/mushroom_leaf{
+ pixel_y = 5;
+ pixel_x = -9
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bB" = (
-/obj/structure/stone_tile/block{
- dir = 4
+/area/ruin/unpowered/ash_walkers)
+"FQ" = (
+/obj/structure/sink/puddle,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"FT" = (
+/obj/structure/lavaland/ash_walker,
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Gl" = (
+/obj/structure/table/wood,
+/obj/item/reagent_containers/cup/glass/bottle/holywater{
+ pixel_y = -1;
+ pixel_x = 5
+ },
+/obj/item/reagent_containers/cup/bottle/fentanyl{
+ pixel_y = 9;
+ pixel_x = -10
},
+/obj/item/reagent_containers/cup/bottle/chloralhydrate{
+ pixel_x = -8
+ },
+/obj/structure/stone_tile/cracked,
/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/turf/open/indestructible/boss,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bC" = (
+"GT" = (
/obj/structure/stone_tile/block/cracked{
dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bD" = (
-/obj/structure/stone_tile/block{
+/obj/structure/stone_tile/cracked{
dir = 4
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"bE" = (
-/obj/structure/stone_tile/surrounding_tile{
- dir = 8
+"Hl" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bF" = (
-/obj/structure/stone_tile/slab,
-/obj/effect/decal/cleanable/blood,
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bG" = (
-/turf/closed/indestructible/riveted/boss/see_through,
/area/ruin/unpowered/ash_walkers)
-"bH" = (
-/obj/structure/necropolis_gate,
+"Hs" = (
/obj/structure/stone_tile/block{
- dir = 4
- },
-/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/obj/structure/fans/tiny/invisible,
-/obj/effect/decal/cleanable/blood,
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 1
+ },
+/obj/structure/table/wood,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"bI" = (
-/obj/structure/stone_tile/slab/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bJ" = (
-/obj/structure/stone_tile/surrounding_tile,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bL" = (
-/obj/structure/stone_tile{
- dir = 4
+"Ht" = (
+/obj/structure/closet/crate/wooden,
+/obj/structure/stone_tile/cracked{
+ dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bM" = (
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bN" = (
-/obj/structure/stone_tile,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bO" = (
-/obj/structure/stone_tile/cracked,
-/obj/effect/mapping_helpers/no_lava,
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/obj/item/food/grown/ambrosia/gaia,
+/obj/item/food/grown/ambrosia/gaia,
+/obj/item/food/grown/ambrosia/gaia,
+/obj/item/reagent_containers/cup/bottle,
+/obj/item/reagent_containers/cup/bottle,
+/obj/item/reagent_containers/cup/bottle,
+/obj/item/reagent_containers/cup/bottle/frostoil,
+/obj/item/reagent_containers/cup/bottle/iron,
+/obj/item/reagent_containers/syringe/crude,
+/obj/item/gun/syringe/blowgun,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bP" = (
-/obj/structure/stone_tile/block,
-/obj/item/spear/bonespear,
-/obj/effect/mapping_helpers/no_lava,
+/area/ruin/unpowered/ash_walkers)
+"Hu" = (
+/obj/structure/stone_tile/surrounding_tile/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bQ" = (
+/area/ruin/unpowered/ash_walkers)
+"Hx" = (
/obj/structure/stone_tile/block,
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/block/cracked{
dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bR" = (
-/obj/structure/stone_tile/surrounding_tile,
+/area/ruin/unpowered/ash_walkers)
+"HH" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/center,
/obj/structure/stone_tile/surrounding_tile{
dir = 1
},
-/obj/structure/stone_tile/surrounding_tile/cracked{
+/obj/structure/stone_tile/surrounding_tile{
dir = 4
},
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"IE" = (
+/obj/structure/bonfire/dense/askwalker,
/obj/structure/stone_tile/center,
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bS" = (
-/obj/structure/stone_tile/slab,
-/obj/effect/mapping_helpers/no_lava,
+/area/ruin/unpowered/ash_walkers)
+"Ji" = (
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/surrounding/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bT" = (
-/obj/structure/stone_tile/surrounding_tile{
+/area/ruin/unpowered/ash_walkers)
+"JP" = (
+/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/structure/stone_tile/surrounding_tile{
- dir = 1
+/obj/structure/stone_tile/cracked{
+ dir = 8
},
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"JR" = (
+/obj/structure/stone_tile/surrounding_tile,
+/obj/structure/stone_tile/center/cracked,
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 8
},
-/obj/structure/stone_tile/center,
-/obj/effect/decal/cleanable/blood,
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bU" = (
-/obj/structure/stone_tile/block/cracked,
+/area/ruin/unpowered/ash_walkers)
+"Kb" = (
+/obj/structure/stone_tile/block,
/obj/structure/stone_tile{
dir = 1
},
/obj/structure/stone_tile{
dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bV" = (
-/obj/structure/stone_tile/block/cracked,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bW" = (
-/obj/structure/stone_tile/surrounding_tile/cracked,
-/obj/structure/ore_box,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bX" = (
-/obj/structure/stone_tile/cracked{
+/obj/item/flashlight/lantern,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"KK" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile{
dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bY" = (
/obj/structure/stone_tile{
- dir = 8
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"bZ" = (
-/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/structure/stone_tile/cracked{
+/obj/effect/decal/cleanable/blood,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"KM" = (
+/obj/structure/stone_tile/block{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cb" = (
-/obj/structure/stone_tile{
+/area/ruin/unpowered/ash_walkers)
+"Lv" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cd" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
+/area/ruin/unpowered/ash_walkers)
+"LL" = (
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
+/obj/structure/stone_tile/cracked,
+/obj/effect/mob_spawn/human/corpse/damaged,
+/obj/effect/decal/cleanable/blood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ce" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/obj/structure/stone_tile/block/cracked{
- dir = 4
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cf" = (
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/structure/closet/crate/internals,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/item/pickaxe,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cg" = (
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ch" = (
-/obj/structure/stone_tile/surrounding_tile,
-/obj/structure/stone_tile/center/cracked,
+/area/ruin/unpowered/ash_walkers)
+"LO" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
+ dir = 4
},
-/obj/structure/stone_tile/surrounding_tile/cracked{
+/obj/structure/stone_tile/surrounding_tile/cracked,
+/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
+/obj/structure/stone_tile/center,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ci" = (
+/area/ruin/unpowered/ash_walkers)
+"Mk" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
@@ -845,538 +928,329 @@
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cj" = (
-/obj/effect/mob_spawn/human/corpse/damaged,
-/obj/effect/decal/cleanable/blood,
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ck" = (
-/obj/item/spear/bonespear,
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cl" = (
-/obj/structure/stone_tile{
- dir = 4
- },
-/obj/structure/stone_tile/cracked{
- dir = 8
- },
-/obj/item/spear/bonespear,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cm" = (
-/obj/structure/stone_tile/block{
- dir = 4
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cn" = (
-/obj/structure/stone_tile/block,
-/obj/structure/stone_tile/block/cracked{
- dir = 1
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"co" = (
-/obj/structure/stone_tile/block/cracked,
-/obj/structure/stone_tile/block{
- dir = 1
- },
-/obj/effect/mapping_helpers/no_lava,
+/area/ruin/unpowered/ash_walkers)
+"MQ" = (
+/obj/structure/stone_tile/surrounding/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cp" = (
-/obj/structure/stone_tile/cracked,
-/obj/structure/stone_tile/block{
- dir = 1
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cq" = (
-/obj/structure/stone_tile/cracked{
- dir = 8
+/area/ruin/unpowered/ash_walkers)
+"MY" = (
+/obj/structure/table/wood,
+/obj/structure/stone_tile/surrounding/cracked,
+/obj/item/stack/sheet/wood/five,
+/obj/item/reagent_containers/cup/bucket,
+/obj/item/flashlight/lantern{
+ pixel_y = 12;
+ pixel_x = -9
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cr" = (
-/obj/structure/stone_tile/surrounding_tile{
- dir = 4
- },
-/obj/structure/stone_tile/center/cracked,
+/area/ruin/unpowered/ash_walkers)
+"Ne" = (
/obj/structure/stone_tile/surrounding_tile/cracked,
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cs" = (
-/obj/structure/stone_tile/block/cracked{
+/obj/structure/stone_tile/center,
+/obj/structure/stone_tile/surrounding_tile{
dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ct" = (
/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
-/obj/structure/stone_tile/center,
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
- },
+/turf/open/lava/smooth/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Np" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cu" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 8
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cv" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 8
- },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cy" = (
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile/cracked,
-/obj/effect/decal/cleanable/blood,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cz" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/item/spear/bonespear,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"cA" = (
-/obj/structure/stone_tile/slab/cracked{
- dir = 4;
- icon_state = "cracked_slab1"
- },
+"Nr" = (
+/obj/item/pickaxe,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cB" = (
-/obj/structure/stone_tile,
+"NE" = (
/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/stone_tile/cracked{
dir = 4
},
/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/effect/decal/cleanable/blood,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"cD" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 4
- },
-/obj/item/flashlight/lantern,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"cE" = (
-/obj/structure/stone_tile/surrounding/cracked,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/ruin/unpowered/ash_walkers)
-"cF" = (
-/obj/structure/stone_tile/block{
- dir = 8
- },
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 1
- },
-/obj/structure/table/wood,
/obj/item/spear/bonespear,
-/obj/item/storage/belt/mining/primitive,
-/turf/open/indestructible/boss,
+/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cI" = (
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/structure/stone_tile/cracked{
- dir = 1
+"Oa" = (
+/obj/structure/stone_tile/surrounding/cracked{
+ dir = 1;
+ icon_state = "cracked_surrounding1"
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cJ" = (
-/obj/item/shovel,
/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cK" = (
-/obj/machinery/hydroponics/soil,
-/obj/structure/stone_tile/block/cracked{
- dir = 1
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cM" = (
+/area/ruin/unpowered/ash_walkers)
+"OA" = (
+/obj/structure/stone_tile,
/obj/structure/stone_tile/block{
dir = 1
},
-/obj/structure/stone_tile/cracked,
/obj/structure/stone_tile{
dir = 8
},
/obj/structure/table/wood,
-/obj/item/spear/bonespear,
-/obj/item/storage/belt/quiver,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/ammo_casing/caseless/arrow/bone,
-/obj/item/gun/ballistic/bow/ashen,
-/turf/open/indestructible/boss,
-/area/ruin/unpowered/ash_walkers)
-"cN" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile{
- dir = 8
- },
-/obj/structure/stone_tile{
- dir = 1
+/obj/item/restraints/legcuffs/bola/watcher{
+ pixel_x = 6;
+ pixel_y = 3
},
-/obj/structure/stone_tile/cracked{
- dir = 4
+/obj/item/restraints/legcuffs/bola/watcher{
+ pixel_x = -1;
+ pixel_y = 7
},
-/obj/structure/table/wood,
-/obj/item/spear/bonespear,
-/obj/item/clothing/head/helmet/roman/legionnaire,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"cO" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 8
- },
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cP" = (
-/obj/structure/stone_tile/block,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cQ" = (
-/obj/structure/stone_tile/block/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cR" = (
-/obj/structure/stone_tile/surrounding_tile/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cT" = (
-/obj/structure/stone_tile,
+"OM" = (
+/obj/structure/necropolis_gate,
/obj/structure/stone_tile/block{
- dir = 1
+ dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cV" = (
-/obj/structure/stone_tile/cracked,
-/obj/structure/stone_tile/block{
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"cW" = (
-/obj/structure/table/optable,
-/obj/structure/stone_tile{
- dir = 1
- },
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cX" = (
-/obj/item/storage/box/rxglasses,
-/obj/structure/stone_tile{
- dir = 1
- },
+"PK" = (
+/obj/structure/stone_tile/block/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/ash_walkers)
-"cY" = (
-/obj/item/seeds/glowshroom,
-/obj/item/seeds/glowshroom,
-/obj/structure/stone_tile/block{
- dir = 4
- },
+"PO" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/lavaland/surface/outdoors)
+"QB" = (
+/turf/closed/wall/mineral/wood,
/area/ruin/unpowered/ash_walkers)
-"cZ" = (
-/obj/structure/stone_tile/surrounding_tile{
- dir = 8
- },
-/obj/structure/stone_tile/block{
+"QJ" = (
+/obj/structure/stone_tile/block/cracked,
+/obj/structure/stone_tile/cracked{
dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dd" = (
-/obj/structure/stone_tile/surrounding_tile/cracked,
-/obj/effect/mapping_helpers/no_lava,
+/obj/structure/table/wood,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"de" = (
+/area/ruin/unpowered/ash_walkers)
+"Rh" = (
+/obj/structure/closet/crate/wooden,
/obj/structure/stone_tile/block/cracked{
- dir = 4
- },
-/obj/structure/stone_tile/block{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/flare,
+/obj/item/flashlight/flare,
+/obj/item/flashlight/flare,
+/obj/item/construction/rcd/loaded,
+/obj/item/flashlight/lantern,
+/obj/item/flashlight/lantern,
+/obj/item/stack/marker_beacon/ten,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"df" = (
-/obj/effect/decal/cleanable/blood,
-/obj/structure/stone_tile/cracked{
+/area/ruin/unpowered/ash_walkers)
+"RE" = (
+/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dg" = (
-/obj/structure/bonfire/dense/askwalker,
-/obj/structure/stone_tile/center,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"di" = (
+/obj/structure/stone_tile/cracked,
/obj/effect/decal/cleanable/blood,
-/obj/structure/stone_tile/block,
-/obj/structure/stone_tile/cracked{
- dir = 4
- },
-/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/obj/effect/mapping_helpers/no_lava,
+/obj/effect/mob_spawn/human/corpse/damaged,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dj" = (
-/obj/structure/stone_tile/block,
+/area/ruin/unpowered/ash_walkers)
+"RY" = (
+/obj/structure/table/wood,
+/obj/item/cultivator,
+/obj/item/scythe,
+/obj/structure/stone_tile/surrounding_tile/cracked,
/obj/structure/stone_tile/block{
dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dk" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 1
- },
-/obj/structure/stone_tile/block,
-/obj/effect/mapping_helpers/no_lava,
+/obj/item/shovel,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dl" = (
-/obj/structure/stone_tile/block/cracked{
- dir = 1
- },
-/obj/structure/stone_tile/cracked,
+/area/ruin/unpowered/ash_walkers)
+"Sy" = (
+/obj/structure/stone_tile/block/cracked,
/obj/structure/stone_tile/cracked{
- dir = 8
+ dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dn" = (
-/obj/structure/stone_tile/block{
- dir = 4
+/area/ruin/unpowered/ash_walkers)
+"Ta" = (
+/obj/structure/stone_tile{
+ dir = 1
},
-/obj/structure/stone_tile/block/cracked{
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Tj" = (
+/obj/item/flashlight/lantern,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Tn" = (
+/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"do" = (
-/obj/structure/sink/puddle{
- pixel_x = -3;
- pixel_y = 1
+/obj/structure/stone_tile/center,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dp" = (
+/area/ruin/unpowered/ash_walkers)
+"Ue" = (
+/obj/structure/closet/crate/miningcar,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/item/storage/bag/ore,
+/obj/item/pickaxe,
/obj/item/pickaxe,
+/obj/item/pickaxe,
+/obj/item/pickaxe,
+/obj/item/pickaxe,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Ul" = (
/obj/structure/stone_tile/cracked{
dir = 1
},
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dq" = (
-/obj/item/stack/sheet/wood,
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/surrounding_tile/cracked{
dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dr" = (
-/obj/structure/stone_tile/surrounding_tile/cracked,
+/area/ruin/unpowered/ash_walkers)
+"Uo" = (
/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
- },
-/obj/structure/stone_tile/surrounding_tile{
dir = 8
},
-/obj/structure/stone_tile/center,
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"ds" = (
-/obj/structure/stone_tile/block,
-/obj/effect/mapping_helpers/no_lava,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dt" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
+/area/ruin/unpowered/ash_walkers)
+"UC" = (
+/obj/structure/stone_tile{
dir = 4
},
-/obj/structure/stone_tile/surrounding_tile/cracked,
-/obj/structure/stone_tile/surrounding_tile{
+/obj/structure/closet/crate/medical,
+/obj/item/storage/firstaid/regular,
+/obj/item/reagent_containers/blood/random,
+/obj/item/reagent_containers/blood/lizard,
+/obj/item/reagent_containers/blood/lizard,
+/obj/item/stack/sheet/cotton/cloth/ten,
+/obj/structure/stone_tile/block/cracked{
dir = 8
},
+/obj/structure/stone_tile/cracked,
+/obj/item/storage/box/rxglasses,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"UN" = (
/obj/structure/stone_tile/center,
-/obj/effect/mapping_helpers/no_lava,
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 8
+ },
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 4
+ },
+/obj/structure/stone_tile/surrounding_tile,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"du" = (
+/area/ruin/unpowered/ash_walkers)
+"VN" = (
+/obj/structure/stone_tile/block{
+ dir = 8
+ },
/obj/structure/stone_tile/cracked{
dir = 1
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dv" = (
+/obj/structure/stone_tile,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"VR" = (
+/obj/structure/table/wood,
/obj/structure/stone_tile/cracked{
dir = 8
},
-/obj/effect/mob_spawn/human/corpse/damaged,
-/obj/effect/decal/cleanable/blood,
+/obj/structure/stone_tile/surrounding_tile/cracked,
/obj/structure/stone_tile/cracked{
- dir = 1
- },
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dw" = (
-/obj/item/reagent_containers/cup/bucket,
-/obj/structure/stone_tile/block/cracked{
dir = 4
},
-/obj/effect/mapping_helpers/no_lava,
+/obj/item/storage/bag/plants/portaseeder,
+/obj/item/seeds/tobacco/lavaland,
+/obj/item/seeds/cotton,
+/obj/item/seeds/glowshroom,
+/obj/item/seeds/glowshroom,
+/obj/item/seeds/bamboo,
+/obj/item/seeds/tower,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dx" = (
-/obj/item/flashlight/lantern,
+/area/ruin/unpowered/ash_walkers)
+"Wm" = (
+/obj/structure/stone_tile/surrounding/cracked,
/obj/structure/stone_tile/center,
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dy" = (
-/obj/machinery/hydroponics/soil,
-/obj/structure/stone_tile/block{
+/area/ruin/unpowered/ash_walkers)
+"WE" = (
+/obj/structure/stone_tile{
dir = 8
},
-/obj/effect/mapping_helpers/no_lava,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dz" = (
-/obj/structure/stone_tile/cracked{
- dir = 1
+/area/ruin/unpowered/ash_walkers)
+"Xp" = (
+/obj/structure/stone_tile,
+/obj/structure/stone_tile{
+ dir = 8
},
-/obj/structure/stone_tile/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dA" = (
-/obj/machinery/hydroponics/soil,
-/obj/structure/stone_tile/surrounding_tile/cracked{
+/obj/structure/stone_tile{
dir = 1
},
-/obj/structure/stone_tile/surrounding_tile,
-/obj/structure/stone_tile/surrounding_tile{
+/obj/structure/stone_tile{
dir = 4
},
-/obj/structure/stone_tile/center,
-/obj/effect/mapping_helpers/no_lava,
+/obj/structure/table/wood,
+/obj/item/spear/bonespear,
+/obj/item/clothing/head/helmet/chaplain/ancient,
+/obj/item/toy/plush/lizard_plushie{
+ name = "Sharpens-the-Spears";
+ pixel_x = 5
+ },
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"XG" = (
+/obj/machinery/hydroponics/soil,
+/obj/structure/stone_tile/block/cracked,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dB" = (
-/obj/structure/stone_tile/surrounding_tile/cracked{
+/area/ruin/unpowered/ash_walkers)
+"XS" = (
+/obj/structure/stone_tile/block{
dir = 4
},
-/obj/structure/stone_tile/surrounding_tile/cracked{
- dir = 1
- },
-/obj/structure/stone_tile/surrounding_tile/cracked{
+/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile/center/cracked,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dC" = (
-/obj/structure/stone_tile,
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dD" = (
-/obj/structure/stone_tile/cracked{
- dir = 8
+/obj/structure/stone_tile{
+ dir = 4
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"dE" = (
-/obj/structure/stone_tile,
-/obj/structure/stone_tile/cracked{
+/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"Yc" = (
+/obj/structure/stone_tile/block/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile{
dir = 8
},
-/turf/closed/mineral/volcanic/lava_land_surface,
-/area/lavaland/surface/outdoors)
-"Jn" = (
+/obj/structure/stone_tile,
+/obj/effect/decal/cleanable/blood,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"Yl" = (
+/obj/structure/punji_sticks,
+/obj/effect/decal/remains/human,
+/obj/effect/decal/cleanable/blood/old,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Yu" = (
/obj/structure/stone_tile,
/obj/structure/stone_tile{
dir = 8
@@ -1384,468 +1258,585 @@
/obj/structure/stone_tile{
dir = 1
},
-/obj/structure/stone_tile{
+/obj/structure/stone_tile/cracked{
dir = 4
},
/obj/structure/table/wood,
-/obj/item/spear/bonespear,
-/obj/item/scythe,
-/obj/item/cultivator,
+/obj/item/claymore/bone,
+/obj/item/shield/riot/goliath,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
-"Ur" = (
-/obj/structure/stone_tile,
+"Yy" = (
+/obj/structure/stone_tile/surrounding_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/cracked{
+ dir = 8
+ },
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"YK" = (
+/obj/structure/stone_tile/block,
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
/obj/structure/stone_tile{
dir = 4
},
+/obj/item/flashlight/lantern,
+/turf/open/indestructible/boss,
+/area/ruin/unpowered/ash_walkers)
+"Zs" = (
+/obj/structure/stone_tile/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"Zt" = (
+/obj/structure/stone_tile/cracked{
+ dir = 1
+ },
+/obj/structure/stone_tile/block/cracked,
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/area/ruin/unpowered/ash_walkers)
+"ZS" = (
+/obj/structure/stone_tile,
/obj/structure/stone_tile{
dir = 8
},
-/obj/structure/stone_tile/cracked{
+/obj/structure/stone_tile{
dir = 1
},
-/obj/item/seeds/cotton,
-/obj/item/seeds/cotton,
+/obj/structure/stone_tile{
+ dir = 4
+ },
+/obj/item/flashlight/lantern,
/turf/open/indestructible/boss,
/area/ruin/unpowered/ash_walkers)
(1,1,1) = {"
-aa
-aa
-aa
-aa
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-aa
-aa
-ah
-ah
-ah
-ah
-aa
-aa
-aa
+AB
+AB
+AB
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+AB
+AB
+AB
+AB
+AB
+AB
+AB
"}
(2,1,1) = {"
-aa
-ah
-ab
-aF
-cV
-ah
-ah
-bi
-ah
-bi
-cO
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-aa
-aa
+AB
+AB
+ey
+ey
+ey
+yl
+yl
+yl
+QB
+yl
+ey
+ey
+ey
+ey
+ey
+ey
+AB
+AB
+AB
+AB
+AB
+AB
"}
(3,1,1) = {"
-aa
-aa
-ah
-as
-as
-as
-as
-ak
-as
-as
-cP
-ah
-ah
-bN
-bY
-dp
-ah
-ah
-ah
-aa
+AB
+ey
+ey
+ey
+yl
+yl
+yl
+QB
+yl
+yl
+yl
+fs
+fs
+fs
+ey
+ey
+ey
+ey
+AB
+AB
+AB
+AB
"}
(4,1,1) = {"
-aa
-aa
-ah
-ak
-aA
-aM
-cY
-bj
-bv
-ak
-cP
-bN
-cg
-cl
-cq
-cq
-dv
-ah
-ah
-aa
+AB
+ey
+ey
+yl
+yl
+pp
+Fh
+Gl
+Ch
+Ht
+yl
+Np
+Tj
+Nr
+fs
+ey
+ey
+ey
+ey
+AB
+AB
+AB
"}
(5,1,1) = {"
-aa
-aa
-ac
-as
-aB
-aN
-Ur
-am
-bw
-ak
-cb
-bZ
-ch
-cm
-cr
-bY
-bL
-cb
-ah
-ah
+ey
+ey
+ey
+yl
+QB
+Ex
+jW
+Zs
+EI
+cO
+EI
+mF
+Ah
+cK
+QB
+yl
+yl
+ey
+ey
+ey
+ey
+AB
"}
(6,1,1) = {"
-aa
-aa
-cT
-ak
-aC
-cX
-aO
-bl
-bx
-bD
-bS
-de
-bV
-dg
-cs
-cy
-bY
-cq
-ah
-ah
+ey
+ey
+yl
+yl
+xO
+ic
+cK
+cK
+cK
+tl
+yl
+Hl
+zt
+Ex
+sG
+xz
+yl
+QB
+ey
+ey
+ey
+ey
"}
(7,1,1) = {"
-aa
-aa
-ae
-as
-cW
-aP
-aZ
-bm
-by
-ak
-bV
-cb
-ci
-bA
-ct
-bN
-bL
-cI
-ah
-ah
+ey
+ey
+QB
+yl
+lf
+UN
+Bf
+cK
+Rh
+QB
+yl
+at
+EG
+Uo
+nt
+fb
+FQ
+yl
+yl
+ey
+ey
+ey
"}
(8,1,1) = {"
-aa
-aa
-ae
-as
-aE
-aQ
-ba
-bn
-bz
-ak
-cb
-df
-bX
-co
-bO
-dq
-bZ
-cJ
-ah
-ah
+ey
+ey
+yl
+QB
+sl
+fx
+uv
+UC
+yl
+QB
+cK
+Ex
+Hx
+pf
+RY
+LO
+EX
+XG
+QB
+ey
+ey
+ey
"}
(9,1,1) = {"
-aa
-ah
-ah
-as
-ak
-as
-as
-as
-ak
-ak
-cg
-cb
-cg
-cn
-bL
-dr
-dw
-dA
-dD
-ah
+ey
+ey
+yl
+yl
+yl
+yl
+yl
+yl
+yl
+bG
+cK
+cK
+Hl
+aw
+VR
+MY
+nt
+Ji
+QB
+ey
+ey
+ey
"}
(10,1,1) = {"
-aa
-ai
-aq
-at
-aF
-aR
-aR
-bo
-bA
-cZ
-dd
-cg
-cb
-di
-dn
-ds
-dx
+ey
+yl
+yl
+yl
+nZ
+bs
+XS
+ZS
+yl
+yl
+Uo
+cK
+Bf
+NE
+ic
+ic
+lk
cK
-dE
-ah
+cK
+yl
+ey
+PO
"}
(11,1,1) = {"
-ab
-aj
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-bF
-bE
-cb
-bL
-co
-cb
-dt
-dy
-dB
-dC
-aa
+ey
+yl
+yl
+Kb
+Ne
+cg
+BC
+ec
+yl
+yl
+Hl
+JP
+mv
+KM
+cO
+WE
+cK
+gQ
+Ej
+yl
+yl
+PO
"}
(12,1,1) = {"
-ac
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-bP
-bL
-bX
-co
-do
-du
-dz
-dC
-ah
-aa
+ey
+yl
+yl
+KK
+bu
+FT
+CD
+DM
+xs
+yV
+cK
+yz
+fv
+IE
+PK
+RE
+cK
+fn
+hQ
+Lv
+OM
+PO
"}
(13,1,1) = {"
-ad
-ak
-ak
-au
-aG
-aS
-bc
-bp
-ak
-ak
-bQ
-bM
-cj
-dj
-ah
-ah
-ah
-ah
-ah
-ah
+ey
+yl
+yl
+YK
+xK
+iA
+HH
+Yc
+yl
+yl
+Np
+Ta
+Mk
+eR
+Tn
+wv
+ic
+Hl
+mp
+yl
+yl
+PO
"}
(14,1,1) = {"
-ae
-ak
-ak
-av
-aH
-aT
-bd
-bq
-ak
-bG
-bR
-cd
-cg
-dk
-cu
-ah
-bi
-bi
-bi
-cO
+ey
+yl
+yl
+yl
+yK
+Dk
+VN
+ZS
+yl
+yl
+cR
+cK
+Ul
+Bw
+Zs
+Bf
+Np
+Wm
+zt
+yl
+ey
+PO
"}
(15,1,1) = {"
-ac
-ak
-ak
-aw
-aI
-aU
-be
-br
-bB
-bH
-bS
-ce
-dn
-dl
-ak
-ak
-as
-ak
-ak
-ah
+ey
+ey
+yl
+yl
+yl
+yl
+yl
+yl
+yl
+so
+cK
+cK
+Hx
+Hu
+mk
+sv
+nW
+oq
+yl
+ey
+ey
+ey
"}
(16,1,1) = {"
-ac
-ak
-ak
-ax
-aJ
-aV
-bf
-bs
-ak
-bG
-bT
-cd
-bX
-dj
-as
-cz
-cD
-Jn
-as
-ah
+ey
+ey
+QB
+yl
+Xp
+Yu
+bE
+pm
+yl
+yl
+gQ
+at
+zt
+cK
+nv
+JR
+Sy
+QJ
+QB
+ey
+ey
+ey
"}
(17,1,1) = {"
-af
-ak
-ak
-ay
-aK
-aW
-bg
-bt
-ak
-ak
-bU
-cg
-ck
-bS
-cv
-cA
-cE
-cM
-as
-ah
+ey
+ey
+yl
+yl
+wC
+Oa
+yy
+js
+Hs
+yl
+at
+mv
+Zt
+cK
+eO
+Yy
+up
+yl
+QB
+ey
+ey
+ey
"}
(18,1,1) = {"
-ac
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-bV
-bX
-bN
-ah
-as
-cB
-cF
-cN
-ak
-cP
+ey
+ey
+yl
+yl
+QB
+zv
+MQ
+qQ
+GT
+Sy
+aw
+oN
+eO
+Ex
+Ex
+LL
+QB
+yl
+ey
+ey
+ey
+ey
"}
(19,1,1) = {"
-ag
-aj
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-bI
-bW
-cf
-ah
-cp
-as
-as
-as
-ak
-ak
-cQ
+ey
+ey
+ey
+yl
+yl
+BJ
+OA
+rj
+ei
+yl
+an
+Ue
+cK
+Tj
+yl
+QB
+yl
+ey
+ey
+ey
+AB
+AB
"}
(20,1,1) = {"
-aa
-al
-ar
-az
-az
-az
-bh
-az
-bC
-bJ
-ah
-ah
-ah
-al
-ah
-ah
-bC
-ah
-ah
-cR
+ey
+ey
+ey
+ey
+QB
+yl
+yl
+yl
+QB
+yl
+fs
+fs
+Yl
+fs
+ey
+ey
+ey
+ey
+AB
+AB
+AB
+AB
+"}
+(21,1,1) = {"
+AB
+ey
+ey
+ey
+ey
+yl
+QB
+yl
+yl
+ey
+ey
+ey
+fs
+ey
+ey
+ey
+ey
+AB
+AB
+AB
+AB
+AB
+"}
+(22,1,1) = {"
+AB
+AB
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+ey
+AB
+AB
+AB
+AB
+AB
+AB
+AB
"}
diff --git a/_maps/boxstation.json b/_maps/boxstation.json
index e2bba152ea251..e91beffc0b738 100644
--- a/_maps/boxstation.json
+++ b/_maps/boxstation.json
@@ -5,7 +5,7 @@
"map_file": "BoxStation.dmm",
"shuttles": {
"cargo": "cargo_box",
- "ferry": "ferry_fancy",
+ "ferry": "ferry_standard",
"whiteship": "whiteship_box",
"emergency": "emergency_box"
}
diff --git a/_maps/corgstation.json b/_maps/corgstation.json
index 405fe87a355e0..2c1d72f4aabce 100644
--- a/_maps/corgstation.json
+++ b/_maps/corgstation.json
@@ -5,7 +5,7 @@
"map_file": "CorgStation.dmm",
"shuttles": {
"cargo": "cargo_corg",
- "ferry": "ferry_fancy",
+ "ferry": "ferry_standard",
"whiteship": "whiteship_box",
"emergency": "emergency_corg"
}
diff --git a/_maps/deltastation.json b/_maps/deltastation.json
index 58d62b2c81614..8cdffa26fafea 100644
--- a/_maps/deltastation.json
+++ b/_maps/deltastation.json
@@ -5,7 +5,7 @@
"map_file": "DeltaStation2.dmm",
"shuttles": {
"emergency": "emergency_delta",
- "ferry": "ferry_fancy",
+ "ferry": "ferry_standard",
"cargo": "cargo_delta",
"whiteship": "whiteship_delta"
}
diff --git a/_maps/echostation.json b/_maps/echostation.json
index 9d3c4e2e47fff..6a0802500f9af 100644
--- a/_maps/echostation.json
+++ b/_maps/echostation.json
@@ -8,7 +8,7 @@
"planet_radius": "100",
"shuttles": {
"cargo": "cargo_tiny",
- "ferry": "ferry_fancy",
+ "ferry": "ferry_standard",
"whiteship": "whiteship_box",
"emergency": "emergency_tiny"
},
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/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index ae678ecd37530..010059d307626 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -6334,7 +6334,7 @@
/obj/docking_port/stationary{
dir = 8;
dwidth = 2;
- height = 13;
+ height = 14;
id = "ferry_away";
json_key = "ferry";
name = "CentCom Ferry Dock";
diff --git a/_maps/metastation.json b/_maps/metastation.json
index 14ebf764f95f7..0df5b3539c48b 100644
--- a/_maps/metastation.json
+++ b/_maps/metastation.json
@@ -5,7 +5,7 @@
"map_file": "MetaStation.dmm",
"shuttles": {
"cargo": "cargo_box",
- "ferry": "ferry_fancy",
+ "ferry": "ferry_standard",
"whiteship": "whiteship_meta",
"emergency": "emergency_meta"
}
diff --git a/_maps/radstation.json b/_maps/radstation.json
index 4ac2e8435d78b..4245a29ce3346 100644
--- a/_maps/radstation.json
+++ b/_maps/radstation.json
@@ -5,7 +5,7 @@
"map_file": "RadStation.dmm",
"shuttles": {
"cargo": "cargo_rad",
- "ferry": "ferry_fancy",
+ "ferry": "ferry_standard",
"whiteship": "whiteship_box",
"emergency": "emergency_delta"
}
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/_maps/shuttles/ferry/ferry_standard.dmm b/_maps/shuttles/ferry/ferry_standard.dmm
new file mode 100644
index 0000000000000..afb4bfb7adbfa
--- /dev/null
+++ b/_maps/shuttles/ferry/ferry_standard.dmm
@@ -0,0 +1,355 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Ferry Shuttle Airlock"
+ },
+/obj/structure/fans/tiny,
+/obj/docking_port/mobile{
+ name = "ferry shuttle";
+ height = 14;
+ width = 5;
+ dwidth = 2;
+ dir = 8;
+ id = "ferry";
+ preferred_direction = 4;
+ dheight = 5
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"c" = (
+/obj/structure/chair/fancy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/transport)
+"f" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/chair/fancy/shuttle,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"g" = (
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/transport)
+"i" = (
+/obj/structure/closet/crate/freezer/blood,
+/obj/machinery/iv_drip,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"j" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/caution/stand_clear{
+ dir = 4
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"m" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 8
+ },
+/obj/effect/spawner/structure/window/plastitanium,
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"o" = (
+/obj/structure/chair/fancy/shuttle,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"p" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/chair/fancy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/transport)
+"q" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/closet/crate/medical,
+/obj/item/storage/firstaid/brute,
+/obj/item/storage/firstaid/fire,
+/obj/item/storage/firstaid/o2,
+/obj/item/storage/firstaid/toxin,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"r" = (
+/obj/structure/sign/nanotrasen,
+/turf/closed/wall/mineral/titanium/nodiagonal,
+/area/shuttle/transport)
+"s" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/obj/item/flashlight/seclite,
+/obj/item/flashlight/seclite,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"t" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/guncase,
+/obj/item/gun/energy/e_gun,
+/obj/item/gun/energy/e_gun,
+/obj/item/gun/grenadelauncher/security,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"v" = (
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"x" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"y" = (
+/obj/effect/spawner/structure/window/shuttle,
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"z" = (
+/obj/structure/chair/fancy/shuttle,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"A" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/chair/fancy/shuttle,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"C" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"E" = (
+/obj/structure/chair/fancy/shuttle,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"F" = (
+/obj/structure/table/optable,
+/obj/item/storage/backpack/duffelbag/sec/surgery,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/transport)
+"G" = (
+/obj/structure/chair/fancy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"I" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/transport)
+"J" = (
+/obj/machinery/computer/shuttle_flight/ferry/request{
+ dir = 8
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"K" = (
+/obj/machinery/door/window/brigdoor{
+ req_access_txt = "101"
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"L" = (
+/obj/structure/table/reinforced,
+/obj/item/radio{
+ pixel_x = 6;
+ pixel_y = 6
+ },
+/obj/item/radio{
+ pixel_y = 4
+ },
+/obj/item/radio{
+ pixel_x = -6;
+ pixel_y = 6
+ },
+/obj/item/crowbar/red,
+/obj/item/crowbar/red,
+/obj/item/storage/box/handcuffs,
+/obj/item/storage/box/flashbangs,
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"M" = (
+/obj/structure/chair/fancy/shuttle,
+/obj/machinery/light/small/directional/north,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"P" = (
+/turf/template_noop,
+/area/shuttle/transport)
+"Q" = (
+/obj/structure/chair/fancy/shuttle{
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"R" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/transport)
+"S" = (
+/obj/machinery/computer/operating,
+/turf/open/floor/mineral/titanium/blue,
+/area/shuttle/transport)
+"T" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+"V" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/chair/fancy/shuttle{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/mineral/plastitanium/red/brig,
+/area/shuttle/transport)
+"X" = (
+/turf/closed/wall/mineral/titanium,
+/area/shuttle/transport)
+"Y" = (
+/obj/structure/tank_dispenser/oxygen,
+/turf/open/floor/mineral/titanium/white,
+/area/shuttle/transport)
+"Z" = (
+/obj/machinery/door/window/brigdoor{
+ req_access_txt = "101";
+ dir = 4
+ },
+/turf/open/floor/mineral/plastitanium,
+/area/shuttle/transport)
+
+(1,1,1) = {"
+P
+I
+I
+I
+P
+"}
+(2,1,1) = {"
+R
+m
+m
+m
+R
+"}
+(3,1,1) = {"
+X
+Q
+K
+c
+X
+"}
+(4,1,1) = {"
+X
+J
+K
+p
+X
+"}
+(5,1,1) = {"
+y
+E
+K
+V
+y
+"}
+(6,1,1) = {"
+y
+o
+x
+t
+y
+"}
+(7,1,1) = {"
+X
+S
+T
+L
+X
+"}
+(8,1,1) = {"
+X
+F
+T
+s
+X
+"}
+(9,1,1) = {"
+y
+A
+C
+i
+y
+"}
+(10,1,1) = {"
+y
+f
+Z
+q
+y
+"}
+(11,1,1) = {"
+X
+z
+j
+G
+X
+"}
+(12,1,1) = {"
+X
+M
+v
+Y
+X
+"}
+(13,1,1) = {"
+g
+X
+v
+X
+g
+"}
+(14,1,1) = {"
+P
+r
+a
+r
+P
+"}
diff --git a/beestation.dme b/beestation.dme
index 7a729c6ae3ef5..cf89e00811efe 100644
--- a/beestation.dme
+++ b/beestation.dme
@@ -536,7 +536,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"
@@ -625,6 +624,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/DNA.dm b/code/__DEFINES/DNA.dm
index e060d62163563..2c1574ed0bf09 100644
--- a/code/__DEFINES/DNA.dm
+++ b/code/__DEFINES/DNA.dm
@@ -50,6 +50,7 @@
#define GELADIKINESIS /datum/mutation/geladikinesis
#define CRYOKINESIS /datum/mutation/cryokinesis
#define CLUWNEMUT /datum/mutation/cluwne
+#define CURSEDCLUWNEMUT /datum/mutation/cluwne/cursed
#define WAXSALIVA /datum/mutation/wax_saliva
#define STRONGWINGS /datum/mutation/strongwings
#define CATCLAWS /datum/mutation/catclaws
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/dcs/signals/signals_movable.dm b/code/__DEFINES/dcs/signals/signals_movable.dm
index 5b3ae553ddadc..6bcfbde38a980 100644
--- a/code/__DEFINES/dcs/signals/signals_movable.dm
+++ b/code/__DEFINES/dcs/signals/signals_movable.dm
@@ -69,8 +69,8 @@
// /datum/element/movetype_handler signals
/// Called when the floating anim has to be temporarily stopped and restarted later: (timer)
#define COMSIG_PAUSE_FLOATING_ANIM "pause_floating_anim"
-/// From base of datum/element/movetype_handler/on_movement_type_trait_gain: (flag)
+/// From base of datum/element/movetype_handler/on_movement_type_trait_gain: (flag, old_movement_type)
#define COMSIG_MOVETYPE_FLAG_ENABLED "movetype_flag_enabled"
-/// From base of datum/element/movetype_handler/on_movement_type_trait_loss: (flag)
+/// From base of datum/element/movetype_handler/on_movement_type_trait_loss: (flag, old_movement_type)
#define COMSIG_MOVETYPE_FLAG_DISABLED "movetype_flag_disabled"
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 342b99743fd63..04e7d943ddb6e 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -141,6 +141,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define FLOATING (1<<3)
#define PHASING (1<<4) //! When moving, will Bump()/Cross() everything, but won't be stopped.
#define THROWN (1<<5) //! while an atom is being thrown
+#define UPSIDE_DOWN (1<<6) /// The mob is walking on the ceiling. Or is generally just, upside down.
+
+/// Combination flag for movetypes which, for all intents and purposes, mean the mob is not touching the ground
+#define MOVETYPES_NOT_TOUCHING_GROUND (FLYING|FLOATING|UPSIDE_DOWN)
//! ## Fire and Acid stuff, for resistance_flags
#define LAVA_PROOF (1<<0)
diff --git a/code/__DEFINES/gravity.dm b/code/__DEFINES/gravity.dm
index 4685b8c7c210d..a638b22be3dd6 100644
--- a/code/__DEFINES/gravity.dm
+++ b/code/__DEFINES/gravity.dm
@@ -12,8 +12,15 @@
/// Singularity is stage 6 (11x11)
#define STAGE_SIX 11 //! From supermatter shard
-/// Anything above this is high gravity, anything below no grav until negative gravity
-#define STANDARD_GRAVITY 1
+/**
+ * The point where gravity is negative enough to pull you upwards.
+ * That means walking checks for a ceiling instead of a floor, and you can fall "upwards"
+ *
+ * This should only be possible on multi-z maps because it works like shit on maps that aren't.
+ */
+#define NEGATIVE_GRAVITY -1
+
+#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav until negative gravity
/// The gravity strength threshold for high gravity damage.
#define GRAVITY_DAMAGE_THRESHOLD 3
/// The scaling factor for high gravity damage.
diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 7385f71578e02..dd6121db10c3d 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -317,4 +317,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// The person with this trait always appears as 'unknown'.
#define TRAIT_UNKNOWN "unknown"
+/// We are ignoring gravity
+#define TRAIT_IGNORING_GRAVITY "ignores_gravity"
+/// We have some form of forced gravity acting on us
+#define TRAIT_FORCED_GRAVITY "forced_gravity"
+#define TRAIT_MOVE_UPSIDE_DOWN "move_upside_down"
+#define TRAIT_NEGATES_GRAVITY "negates_gravity"
+
// END TRAIT DEFINES
diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm
index fea059205dc72..d52b459750be9 100644
--- a/code/__DEFINES/traits/sources.dm
+++ b/code/__DEFINES/traits/sources.dm
@@ -133,3 +133,6 @@
#define NO_GRAVITY_TRAIT "no-gravity"
#define LIFECANDLE_TRAIT "lifecandle"
#define LEAPER_BUBBLE_TRAIT "leaper-bubble"
+#define NEGATIVE_GRAVITY_TRAIT "negative-gravity"
+/// Sources for TRAIT_IGNORING_GRAVITY
+#define IGNORING_GRAVITY_NEGATION "ignoring_gravity_negation"
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/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index 2d121bb1829d5..8d75b40d3dd9d 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -153,7 +153,8 @@ DEFINE_BITFIELD(movement_type, list(
"FLYING" = FLYING,
"VENTCRAWLING" = VENTCRAWLING,
"FLOATING" = FLOATING,
- "PHASING" = PHASING
+ "PHASING" = PHASING,
+ "UPSIDE_DOWN" = UPSIDE_DOWN,
))
DEFINE_BITFIELD(mat_container_flags, list(
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index bb40b3836fbf8..aab4c39b3d4b4 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -178,7 +178,11 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_NORADDAMAGE" = TRAIT_NORADDAMAGE,
"TRAIT_MOBILE" = TRAIT_MOBILE,
"INSTANT_DO_AFTER" = INSTANT_DO_AFTER,
- "TRAIT_UNKNOWN" = TRAIT_UNKNOWN
+ "TRAIT_UNKNOWN" = TRAIT_UNKNOWN,
+ "TRAIT_IGNORING_GRAVITY" = TRAIT_IGNORING_GRAVITY,
+ "TRAIT_FORCED_GRAVITY" = TRAIT_FORCED_GRAVITY,
+ "TRAIT_MOVE_UPSIDE_DOWN" = TRAIT_MOVE_UPSIDE_DOWN,
+ "TRAIT_NEGATES_GRAVITY" = TRAIT_NEGATES_GRAVITY
),
/obj/item/integrated_circuit = list(
"TRAIT_COMPONENT_MMI" = TRAIT_COMPONENT_MMI,
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index dd5f5e8722411..51325b3bab772 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -248,6 +248,11 @@ If you're feeling frisky, examine yourself and click the underlined item to pull
var/mob/living/carbon/M = usr
return M.help_shake_act(M)
+/atom/movable/screen/alert/negative
+ name = "Negative Gravity"
+ desc = "You're getting pulled upwards. While you won't have to worry about falling down anymore, you may accidentally fall upwards!"
+ icon_state = "negative"
+
/atom/movable/screen/alert/weightless
name = "Weightless"
desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index add3bf18afaa8..d2d8fba411651 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -55,6 +55,10 @@ SUBSYSTEM_DEF(mapping)
var/datum/space_level/empty_space
var/num_of_res_levels = 1
+ ///shows the default gravity value for each z level. recalculated when gravity generators change.
+ ///List in the form: list(z level num = max generator gravity in that z level OR the gravity level trait)
+ var/list/gravity_by_z_level = list()
+
/datum/controller/subsystem/mapping/PreInit()
..()
#ifdef FORCE_MAP
@@ -126,6 +130,7 @@ SUBSYSTEM_DEF(mapping)
generate_station_area_list()
transit = add_new_zlevel("Transit/Reserved", list(ZTRAIT_RESERVED = TRUE))
initialize_reserved_level(transit.z_value)
+ calculate_default_z_level_gravities()
return SS_INIT_SUCCESS
/datum/controller/subsystem/mapping/fire(resumed)
@@ -617,6 +622,9 @@ GLOBAL_LIST_EMPTY(the_station_areas)
/// - Adds to z_list, and builds its area turfs
/datum/controller/subsystem/mapping/proc/manage_z_level(datum/space_level/new_z, filled_with_space, contain_turfs = TRUE)
z_list += new_z
+
+ gravity_by_z_level.len += 1
+
if(contain_turfs)
build_area_turfs(new_z.z_value, filled_with_space)
@@ -632,6 +640,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
var/area/our_area = to_contain.loc
our_area.contained_turfs += to_contain
+/datum/controller/subsystem/mapping/proc/calculate_default_z_level_gravities()
+ for(var/z_level in 1 to length(z_list))
+ calculate_z_level_gravity(z_level)
+
/datum/controller/subsystem/mapping/proc/generate_z_level_linkages()
for(var/z_level in 1 to length(z_list))
generate_linkages_for_z_level(z_level)
@@ -650,3 +662,16 @@ GLOBAL_LIST_EMPTY(the_station_areas)
multiz_levels[z_level] = new /list(LARGEST_Z_LEVEL_INDEX)
multiz_levels[z_level][Z_LEVEL_UP] = !!z_above
multiz_levels[z_level][Z_LEVEL_DOWN] = !!z_below
+
+/datum/controller/subsystem/mapping/proc/calculate_z_level_gravity(z_level_number)
+ if(!isnum(z_level_number) || z_level_number < 1)
+ return FALSE
+
+ var/max_gravity = 0
+
+ for(var/obj/machinery/gravity_generator/main/grav_gen as anything in GLOB.gravity_generators["[z_level_number]"])
+ max_gravity = max(grav_gen.setting, max_gravity)
+
+ max_gravity = max_gravity || level_trait(z_level_number, ZTRAIT_GRAVITY) || 0 //just to make sure no nulls
+ gravity_by_z_level[z_level_number] = max_gravity
+ return max_gravity
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/caltrop.dm b/code/datums/components/caltrop.dm
index 67e76e0592e17..ff2c7611bc549 100644
--- a/code/datums/components/caltrop.dm
+++ b/code/datums/components/caltrop.dm
@@ -55,7 +55,7 @@
if(!(flags & CALTROP_BYPASS_SHOES) && (H.shoes || feetCover))
return
- if((H.movement_type & (FLYING|FLOATING)) || (H.body_position == LYING_DOWN)|| H.buckled)
+ if((H.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || (H.body_position == LYING_DOWN)|| H.buckled)
return
var/damage = rand(min_damage, max_damage)
diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm
index c439bcee66ce0..3db67bab6209a 100644
--- a/code/datums/components/chasm.dm
+++ b/code/datums/components/chasm.dm
@@ -69,7 +69,7 @@
return FALSE
if(!isliving(AM) && !isobj(AM))
return FALSE
- if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & (FLOATING|FLYING)))
+ if(is_type_in_typecache(AM, forbidden_types) || AM.throwing || (AM.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
return FALSE
//Flies right over the chasm
if(ismob(AM))
diff --git a/code/datums/components/conveyor_movement.dm b/code/datums/components/conveyor_movement.dm
index 43fb9979a2cc9..6ec3f30830731 100644
--- a/code/datums/components/conveyor_movement.dm
+++ b/code/datums/components/conveyor_movement.dm
@@ -24,7 +24,7 @@
source.delay = speed //We use the default delay
if(living_parent)
var/mob/living/moving_mob = parent
- if((moving_mob.movement_type & (FLOATING|FLYING)) && !moving_mob.stat)
+ if((moving_mob.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) && !moving_mob.stat)
return MOVELOOP_SKIP_STEP
var/atom/movable/moving_parent = parent
if(moving_parent.anchored || !moving_parent.has_gravity())
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/components/slippery.dm b/code/datums/components/slippery.dm
index 3b244d5e16f8a..39907f144d6d0 100644
--- a/code/datums/components/slippery.dm
+++ b/code/datums/components/slippery.dm
@@ -34,7 +34,7 @@
if(!isliving(arrived))
return
var/mob/living/victim = arrived
- if(!(victim.movement_type & (FLOATING|FLYING)) && victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items) && callback)
+ if(!(victim.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) && victim.slip(knockdown_time, parent, lube_flags, paralyze_time, force_drop_items) && callback)
callback.Invoke(victim)
/datum/component/slippery/UnregisterFromParent()
diff --git a/code/datums/components/spikes.dm b/code/datums/components/spikes.dm
index be078a73721c7..a2a2daac40a68 100644
--- a/code/datums/components/spikes.dm
+++ b/code/datums/components/spikes.dm
@@ -58,7 +58,7 @@
if(ishuman(C))
var/mob/living/carbon/human/H = C
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
- if((H.movement_type & (FLOATING|FLYING)) || H.body_position == LYING_DOWN || H.buckled || H.shoes || feetCover)
+ if((H.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || H.body_position == LYING_DOWN || H.buckled || H.shoes || feetCover)
prick(H, 0.5)
else
prick(H, 2)
diff --git a/code/datums/components/squashable.dm b/code/datums/components/squashable.dm
index f9159614909fd..9091ef34e981d 100644
--- a/code/datums/components/squashable.dm
+++ b/code/datums/components/squashable.dm
@@ -53,7 +53,7 @@
if(isliving(crossing_movable))
var/mob/living/crossing_mob = crossing_movable
- if(crossing_mob.mob_size > MOB_SIZE_SMALL && !(crossing_mob.movement_type & (FLOATING|FLYING)))
+ if(crossing_mob.mob_size > MOB_SIZE_SMALL && !(crossing_mob.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
if(HAS_TRAIT(crossing_mob, TRAIT_PACIFISM))
crossing_mob.visible_message("[crossing_mob] carefully steps over [parent_as_living]. ", "You carefully step over [parent_as_living] to avoid hurting it. ")
return
diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm
index 8757402c7b2e9..9c1d694be9bc9 100644
--- a/code/datums/components/squeak.dm
+++ b/code/datums/components/squeak.dm
@@ -94,7 +94,7 @@
return
if(istype(arrived, /obj/effect/dummy/phased_mob)) //don't squeek if they're in a phased/jaunting container.
return
- if(arrived.movement_type & (FLYING|FLOATING) || !arrived.has_gravity())
+ if(arrived.movement_type & MOVETYPES_NOT_TOUCHING_GROUND || !arrived.has_gravity())
return
var/atom/current_parent = parent
if(isturf(current_parent?.loc))
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 0c9882638a2ca..db6b991f3cb78 100644
--- a/code/datums/diseases/_disease.dm
+++ b/code/datums/diseases/_disease.dm
@@ -28,7 +28,7 @@
var/cure_chance = 4
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
@@ -152,10 +152,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 3a338950a4af3..2d3e27bd238da 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -304,7 +304,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 = clamp(7.5 - (0.5 * resistance), 5, 10) // can be between 5 and 10
stage_prob = max(stage_rate, 1)
SetDanger(severity)
diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm
index 7298df65221dd..1afc8a3263298 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 fc3d559b3220b..14f2d6c2ebe3b 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 bd935bc53d884..b1784b501cb26 100644
--- a/code/datums/diseases/flu.dm
+++ b/code/datums/diseases/flu.dm
@@ -7,7 +7,7 @@
cure_chance = 5
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 0bb67de3997b1..074115c2dbbd1 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 6448bd77e78ae..5ab9fc953ef4e 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(delta_time, times_fired)
diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm
index 24022dbea700c..a13bdad315592 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 c9a57af264eb2..917da997abc52 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 6e9f0a6247276..32b82fe0991a3 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -7,7 +7,7 @@
cure_chance = 50
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 ca32fadc48022..c8e7d6088f15d 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 = 1
var/restcure = 0
diff --git a/code/datums/diseases/rhumba_beat.dm b/code/datums/diseases/rhumba_beat.dm
index bc1c65bd34079..258cc1afb17cd 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(delta_time, times_fired)
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index 76f22f9f24d01..8f93942c6e4ed 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/elements/forced_gravity.dm b/code/datums/elements/forced_gravity.dm
index 17f2651dc485c..51a0c270e77fa 100644
--- a/code/datums/elements/forced_gravity.dm
+++ b/code/datums/elements/forced_gravity.dm
@@ -4,7 +4,7 @@
var/gravity
var/ignore_space
-/datum/element/forced_gravity/Attach(datum/target, gravity=1, ignore_space=FALSE)
+/datum/element/forced_gravity/Attach(datum/target, gravity=1, ignore_space=FALSE, can_override = FALSE)
. = ..()
if(!isatom(target))
return ELEMENT_INCOMPATIBLE
@@ -12,21 +12,26 @@
src.gravity = gravity
src.ignore_space = ignore_space
- RegisterSignal(target, COMSIG_ATOM_HAS_GRAVITY, PROC_REF(gravity_check))
+ RegisterSignal(target, COMSIG_ATOM_HAS_GRAVITY, PROC_REF(gravity_check), override = can_override)
if(isturf(target))
- RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, PROC_REF(turf_gravity_check))
+ RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, PROC_REF(turf_gravity_check), override = can_override)
+
+ ADD_TRAIT(target, TRAIT_FORCED_GRAVITY, REF(src))
/datum/element/forced_gravity/Detach(datum/source, force)
. = ..()
var/static/list/signals_b_gone = list(COMSIG_ATOM_HAS_GRAVITY, COMSIG_TURF_HAS_GRAVITY)
UnregisterSignal(source, signals_b_gone)
+ REMOVE_TRAIT(source, TRAIT_FORCED_GRAVITY, REF(src))
/datum/element/forced_gravity/proc/gravity_check(datum/source, turf/location, list/gravs)
SIGNAL_HANDLER
- if(!ignore_space && isspaceturf(location))
- return
+ if(!ignore_space && location.force_no_gravity)
+ return FALSE
gravs += gravity
+ return TRUE
+
/datum/element/forced_gravity/proc/turf_gravity_check(datum/source, atom/checker, list/gravs)
SIGNAL_HANDLER
- return gravity_check(null, source, gravs)
+ gravity_check(null, source, gravs)
diff --git a/code/datums/elements/movetype_handler.dm b/code/datums/elements/movetype_handler.dm
index 3e648d01c4f5a..b33800738307e 100644
--- a/code/datums/elements/movetype_handler.dm
+++ b/code/datums/elements/movetype_handler.dm
@@ -52,7 +52,9 @@
if(!(source.movement_type & (FLOATING|FLYING)) && (trait == TRAIT_MOVE_FLYING || trait == TRAIT_MOVE_FLOATING) && !paused_floating_anim_atoms[source] && !HAS_TRAIT(source, TRAIT_NO_FLOATING_ANIM))
DO_FLOATING_ANIM(source)
source.movement_type |= flag
- SEND_SIGNAL(source, COMSIG_MOVETYPE_FLAG_ENABLED, flag)
+ if((trait == TRAIT_MOVE_FLYING || trait == TRAIT_MOVE_FLOATING) && !(source.movement_type & (FLOATING|FLYING)))
+ stop_floating(source)
+ SEND_SIGNAL(source, COMSIG_MOVETYPE_FLAG_DISABLED, flag)
/// Called when a movement type trait is removed from the movable. Disables the relative bitflag if it wasn't there in the compile-time bitfield.
/datum/element/movetype_handler/proc/on_movement_type_trait_loss(atom/movable/source, trait)
@@ -60,10 +62,14 @@
var/flag = GLOB.movement_type_trait_to_flag[trait]
if(initial(source.movement_type) & flag)
return
+ var/old_state = source.movement_type
source.movement_type &= ~flag
- if((trait == TRAIT_MOVE_FLYING || trait == TRAIT_MOVE_FLOATING) && !(source.movement_type & (FLOATING|FLYING)))
+ if((old_state & (FLOATING|FLYING)) && !(source.movement_type & (FLOATING|FLYING)))
stop_floating(source)
- SEND_SIGNAL(source, COMSIG_MOVETYPE_FLAG_DISABLED, flag)
+ var/turf/pitfall = source.loc //Things that don't fly fall in open space.
+ if(istype(pitfall))
+ pitfall.zFall(source)
+ SEND_SIGNAL(source, COMSIG_MOVETYPE_FLAG_DISABLED, flag, old_state)
/// Called when the TRAIT_NO_FLOATING_ANIM trait is added to the movable. Stops it from bobbing up and down.
/datum/element/movetype_handler/proc/on_no_floating_anim_trait_gain(atom/movable/source, trait)
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/datums/mutations/cluwne.dm b/code/datums/mutations/cluwne.dm
index 318e5e63db173..bf7ace0d291e2 100644
--- a/code/datums/mutations/cluwne.dm
+++ b/code/datums/mutations/cluwne.dm
@@ -3,6 +3,8 @@
desc = "Turns a person into a Cluwne, a poor soul cursed to a short and miserable life by the honkmother."
quality = NEGATIVE
locked = TRUE
+ mutadone_proof = TRUE
+ var/list/datum/weakref/clothing_weakrefs = list()
/datum/mutation/cluwne/on_acquiring(mob/living/carbon/owner)
if(..())
@@ -13,29 +15,18 @@
playsound(owner.loc, 'sound/misc/bikehorn_creepy.ogg', vol = 50, vary = TRUE)
owner.equip_to_slot_or_del(new /obj/item/storage/backpack/clown(owner), ITEM_SLOT_BACK) // this is purely for cosmetic purposes incase they aren't wearing anything in that slot
- if(!istype(owner.wear_mask, /obj/item/clothing/mask/cluwne))
- if(!owner.doUnEquip(owner.wear_mask))
- qdel(owner.wear_mask)
- owner.equip_to_slot_or_del(new /obj/item/clothing/mask/cluwne(owner), ITEM_SLOT_MASK)
-
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- if(!istype(H.w_uniform, /obj/item/clothing/under/cluwne))
- if(!H.doUnEquip(H.w_uniform))
- qdel(H.w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/cluwne(H), ITEM_SLOT_ICLOTHING)
- if(!istype(H.shoes, /obj/item/clothing/shoes/cluwne))
- if(!H.doUnEquip(H.shoes))
- qdel(H.shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/cluwne(H), ITEM_SLOT_FEET)
- owner.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/white(owner), ITEM_SLOT_GLOVES) // ditto
+ equip_cursed_clothing(/obj/item/clothing/mask/cluwne, ITEM_SLOT_MASK)
+ equip_cursed_clothing(/obj/item/clothing/under/cluwne, ITEM_SLOT_ICLOTHING)
+ equip_cursed_clothing(/obj/item/clothing/shoes/cluwne, ITEM_SLOT_FEET)
+ equip_cursed_clothing(/obj/item/clothing/gloves/color/white, ITEM_SLOT_GLOVES)
+ owner.regenerate_icons()
/datum/mutation/cluwne/on_life()
if(prob(15) && owner.IsUnconscious())
owner.setOrganLoss(ORGAN_SLOT_BRAIN, 199)
switch(rand(1, 6))
if(1)
- owner.say("HONK")
+ owner.say("HONK", forced = "cluwne")
if(2 to 5)
owner.emote("scream")
if(6)
@@ -44,17 +35,37 @@
owner.Jitter(500)
/datum/mutation/cluwne/on_losing(mob/living/carbon/owner)
- owner.adjust_fire_stacks(1)
- owner.IgniteMob()
- owner.dna.add_mutation(CLUWNEMUT)
+ owner.emote("scream")
+ owner.visible_message("[owner] faints as [owner.p_their()] cursed cluwne clothing melts away! ")
+ owner.Unconscious(rand(45 SECONDS, 70 SECONDS))
+ owner.dna.remove_mutation(CLOWNMUT)
+ owner.dna.remove_mutation(EPILEPSY)
+ for(var/datum/weakref/clothing_weakref in clothing_weakrefs)
+ var/obj/item/clothing/clothing = clothing_weakref.resolve()
+ if(QDELETED(clothing))
+ continue
+ if(!owner.doUnEquip(clothing, force = TRUE, silent = TRUE))
+ qdel(clothing)
+ clothing_weakrefs.Cut()
+
+/datum/mutation/cluwne/proc/equip_cursed_clothing(type, slot)
+ var/obj/item/clothing/original_clothing = owner.get_item_by_slot(slot)
+ if(istype(original_clothing, type))
+ return
+ if(!QDELETED(original_clothing) && !owner.doUnEquip(original_clothing, silent = TRUE))
+ qdel(original_clothing)
+ var/obj/item/clothing/cursed_clothing = new type(owner)
+ if(owner.equip_to_slot_or_del(cursed_clothing, slot))
+ clothing_weakrefs += WEAKREF(cursed_clothing)
-/mob/living/carbon/proc/cluwneify()
- dna.add_mutation(CLUWNEMUT)
+/mob/living/carbon/proc/cluwneify(cursed = FALSE)
+ dna.add_mutation(cursed ? CURSEDCLUWNEMUT : CLUWNEMUT)
emote("scream")
regenerate_icons()
- visible_message("[src]'s body glows green, the glow dissipating only to leave behind a cluwne formerly known as [src]! ", \
+ visible_message("[src]'s body glows green, the glow dissipating only to leave behind a cluwne formerly known as [src] ! ", \
"Your brain feels like it's being torn apart, there is only the honkmother now. ")
- flash_act()
+ flash_act(override_blindness_check = TRUE)
+ client?.give_award(/datum/award/achievement/misc/cluwne, src)
- if (client)
- client.give_award(/datum/award/achievement/misc/cluwne, src)
+/datum/mutation/cluwne/cursed
+ scrambled = TRUE
diff --git a/code/datums/proximity_monitor/fields/gravity.dm b/code/datums/proximity_monitor/fields/gravity.dm
index ccac71a6d8508..b55a6521c32ed 100644
--- a/code/datums/proximity_monitor/fields/gravity.dm
+++ b/code/datums/proximity_monitor/fields/gravity.dm
@@ -9,7 +9,7 @@
/datum/proximity_monitor/advanced/gravity/setup_field_turf(turf/T)
. = ..()
- T.AddElement(/datum/element/forced_gravity, gravity_value)
+ T.AddElement(/datum/element/forced_gravity, gravity_value, can_override = TRUE)
modified_turfs[T] = gravity_value
/datum/proximity_monitor/advanced/gravity/cleanup_field_turf(turf/T)
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index d5719c700df73..a215cf1f38566 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -536,6 +536,11 @@
Definitely high quality meat, nothin' wrong with it, nothin' added, definitely no zombifyin' reagents!"
admin_notes = "Meat currently contains no zombifying reagents, lizard on meatspike must be spawned in."
+/datum/map_template/shuttle/ferry/standard
+ suffix = "standard"
+ name = "standard nanotrasen ferry"
+ description = "The standard Nanotrasen ERT Ferry, comes with everything you need to assist the station!"
+
/datum/map_template/shuttle/ferry/lighthouse
suffix = "lighthouse"
name = "The Lighthouse(?)"
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 424ababd42754..bbf4ded5ea828 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -410,7 +410,8 @@
/datum/status_effect/changeling/mindshield
id = "changelingmindshield"
alert_type = /atom/movable/screen/alert/status_effect/changeling_mindshield
- tick_interval = 30
+ tick_interval = 5 SECONDS
+ chem_per_tick = 1
/datum/status_effect/changeling/mindshield/tick()
if(..() && owner.on_fire)
diff --git a/code/datums/weather/weather_types/floor_is_lava.dm b/code/datums/weather/weather_types/floor_is_lava.dm
index 9762499693560..61bf86a2c3c12 100644
--- a/code/datums/weather/weather_types/floor_is_lava.dm
+++ b/code/datums/weather/weather_types/floor_is_lava.dm
@@ -35,6 +35,6 @@
return
if(!L.client) //Only sentient people are going along with it!
return
- if(L.movement_type & (FLOATING|FLYING))
+ if(L.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
return
L.adjustFireLoss(3)
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 9aa198d1ae78c..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
@@ -1897,6 +1914,12 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom)
* Sends signals [COMSIG_ATOM_HAS_GRAVITY] and [COMSIG_TURF_HAS_GRAVITY], both can force gravity with
* the forced gravity var.
*
+ * HEY JACKASS, LISTEN
+ * IF YOU ADD SOMETHING TO THIS PROC, MAKE SURE /mob/living ACCOUNTS FOR IT
+ *
+ * Living mobs treat gravity in an event based manner. We've decomposed this proc into different checks
+ * for them to use. If you add more to it, make sure you do that, or things will behave strangely
+ *
* Gravity situations:
* * No gravity if you're not in a turf
* * No gravity if this atom is in is a space turf
@@ -1909,32 +1932,25 @@ CREATION_TEST_IGNORE_SUBTYPES(/atom)
if(!isturf(gravity_turf))
gravity_turf = get_turf(src)
- if(!gravity_turf)
+ if(!gravity_turf)//no gravity in nullspace
return FALSE
var/list/forced_gravity = list()
SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity)
- if(!length(forced_gravity))
- SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
+ SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity)
if(length(forced_gravity))
- var/max_grav
- for(var/i in forced_gravity)
- max_grav = max(max_grav, i)
- return max_grav
+ var/positive_grav = max(forced_gravity)
+ var/negative_grav = min(min(forced_gravity), 0) //negative grav needs to be below or equal to 0
- if(!gravity_turf.check_gravity()) // Turf never has gravity
- return FALSE
- var/area/A = get_area(gravity_turf)
- if(A.has_gravity) // Areas which always has gravity
- return TRUE
- else if(SSmapping.level_trait(gravity_turf.z, ZTRAIT_GRAVITY)) // If the z-level always has gravity
- return TRUE
- else if(GLOB.gravity_generators["[gravity_turf.get_virtual_z_level()]"]) // If there's a gravity generator on our z level
- var/max_grav = 0
- for(var/obj/machinery/gravity_generator/main/G in GLOB.gravity_generators["[gravity_turf.get_virtual_z_level()]"])
- max_grav = max(G.setting,max_grav)
- return max_grav
- return FALSE
+ //our gravity is sum of the most massive positive and negative numbers returned by the signal
+ //so that adding two forced_gravity elements with an effect size of 1 each doesnt add to 2 gravity
+ //but negative force gravity effects can cancel out positive ones
+
+ return (positive_grav + negative_grav)
+
+ var/area/turf_area = gravity_turf.loc
+
+ return !gravity_turf.force_no_gravity && (SSmapping.gravity_by_z_level[gravity_turf.z] || turf_area.has_gravity)
/*
* Called when something made out of plasma is exposed to high temperatures.
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/effects/mines.dm b/code/game/objects/effects/mines.dm
index b860bda0a83f1..7940d16e74694 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -125,7 +125,7 @@
/obj/effect/mine/proc/on_entered(datum/source, atom/movable/AM)
SIGNAL_HANDLER
- if(!isturf(loc) || AM.throwing || (AM.movement_type & (FLYING | FLOATING)) || !AM.has_gravity() || triggered)
+ if(!isturf(loc) || AM.throwing || (AM.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || !AM.has_gravity() || triggered)
return
if(ismob(AM))
checksmartmine(AM)
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/dna_injector.dm b/code/game/objects/items/dna_injector.dm
index 625224cf05b48..9c23ff1b0c7ae 100644
--- a/code/game/objects/items/dna_injector.dm
+++ b/code/game/objects/items/dna_injector.dm
@@ -154,12 +154,22 @@
/obj/item/dnainjector/cluwnemut
name = "\improper DNA injector (Cluwneify)"
desc = "This is your last chance to turn back."
- add_mutations = list(CLOWNMUT)
+ add_mutations = list(CLUWNEMUT)
/obj/item/dnainjector/anticluwne
+ name = "\improper DNA injector (Anti-Cluwne)"
+ desc = "This is going to hurt."
+ remove_mutations = list(CLUWNEMUT)
+
+/obj/item/dnainjector/cursedcluwnemut
+ name = "\improper DNA injector (Cluwneify)"
+ desc = "This is your last chance to turn back."
+ add_mutations = list(CURSEDCLUWNEMUT)
+
+/obj/item/dnainjector/anticursedcluwne
name = "\improper DNA injector (Anti-Cluwne)"
desc = "This isn't going to work."
- remove_mutations = list(CLOWNMUT)
+ remove_mutations = list(CURSEDCLUWNEMUT)
/obj/item/dnainjector/antitour
name = "\improper DNA injector (Anti-Tour.)"
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 1c16677c2f466..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
@@ -215,7 +220,7 @@
. = ..()
update_icon()
var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(spring_trap),
+ COMSIG_ATOM_ENTERED = PROC_REF(trap_stepped_on),
)
AddElement(/datum/element/connect_loc, loc_connections)
@@ -241,41 +246,53 @@
update_appearance()
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
-/obj/item/restraints/legcuffs/beartrap/proc/spring_trap(datum/source, AM as mob|obj)
+/obj/item/restraints/legcuffs/beartrap/proc/trap_stepped_on(datum/source, atom/movable/entering, ...)
SIGNAL_HANDLER
- if(armed && isturf(loc))
- if(isliving(AM))
- var/mob/living/L = AM
- var/snap = TRUE
- if(istype(L.buckled, /obj/vehicle))
- var/obj/vehicle/ridden_vehicle = L.buckled
- if(!ridden_vehicle.are_legs_exposed) //close the trap without injuring/trapping the rider if their legs are inside the vehicle at all times.
- close_trap()
- ridden_vehicle.visible_message("[ridden_vehicle] triggers \the [src]. ")
-
- if(L.movement_type & (FLYING|FLOATING)) //don't close the trap if they're flying/floating over it.
- snap = FALSE
-
- var/def_zone = BODY_ZONE_CHEST
- if(snap && iscarbon(L))
- var/mob/living/carbon/C = L
- if(C.body_position == STANDING_UP)
- def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- if(!C.legcuffed && C.num_legs >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
- C.legcuffed = src
- forceMove(C)
- C.update_equipment_speed_mods()
- C.update_inv_legcuffed()
- SSblackbox.record_feedback("tally", "handcuffs", 1, type)
- else if(snap && isanimal(L))
- var/mob/living/simple_animal/SA = L
- if(SA.mob_size <= MOB_SIZE_TINY) //don't close the trap if they're as small as a mouse.
- snap = FALSE
- if(snap)
- close_trap()
- L.visible_message("[L] triggers \the [src]. ", \
- "You trigger \the [src]! ")
- L.apply_damage(trap_damage, BRUTE, def_zone)
+
+ spring_trap(entering)
+
+/**
+ * Tries to spring the trap on the target movable.
+ *
+ * This proc is safe to call without knowing if the target is valid or if the trap is armed.
+ *
+ * Does not trigger on tiny mobs.
+ * If ignore_movetypes is FALSE, does not trigger on floating / flying / etc. mobs.
+ */
+/obj/item/restraints/legcuffs/beartrap/proc/spring_trap(atom/movable/target, ignore_movetypes = FALSE, hit_prone = FALSE)
+ if(!armed || !isturf(loc) || !isliving(target))
+ return
+
+ var/mob/living/victim = target
+ if(istype(victim.buckled, /obj/vehicle))
+ var/obj/vehicle/ridden_vehicle = victim.buckled
+ if(!ridden_vehicle.are_legs_exposed) //close the trap without injuring/trapping the rider if their legs are inside the vehicle at all times.
+ close_trap()
+ ridden_vehicle.visible_message("[ridden_vehicle] triggers \the [src]. ")
+ return
+
+ //don't close the trap if they're as small as a mouse
+ if(victim.mob_size <= MOB_SIZE_TINY)
+ return
+ if(!ignore_movetypes && (victim.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
+ return
+
+ close_trap()
+ if(ignore_movetypes)
+ victim.visible_message("\The [src] ensnares [victim]! ", \
+ "\The [src] ensnares you! ")
+ else
+ victim.visible_message("[victim] triggers \the [src]. ", \
+ "You trigger \the [src]! ")
+ var/def_zone = BODY_ZONE_CHEST
+ if(iscarbon(victim) && (victim.body_position == STANDING_UP || hit_prone))
+ var/mob/living/carbon/carbon_victim = victim
+ def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ if(!carbon_victim.legcuffed && carbon_victim.num_legs >= 2) //beartrap can't cuff your leg if there's already a beartrap or legcuffs, or you don't have two legs.
+ INVOKE_ASYNC(carbon_victim, TYPE_PROC_REF(/mob/living/carbon, equip_to_slot), src, ITEM_SLOT_LEGCUFFED)
+ SSblackbox.record_feedback("tally", "handcuffs", 1, type)
+
+ victim.apply_damage(trap_damage, BRUTE, def_zone)
/obj/item/restraints/legcuffs/beartrap/energy
name = "energy snare"
@@ -296,7 +313,7 @@
qdel(src)
/obj/item/restraints/legcuffs/beartrap/energy/attack_hand(mob/user, list/modifiers)
- spring_trap(null, user)
+ spring_trap(user)
return ..()
/obj/item/restraints/legcuffs/beartrap/energy/cyborg
@@ -371,7 +388,7 @@
/obj/item/restraints/legcuffs/bola/energy/ensnare(mob/living/carbon/C)
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(C))
- B.spring_trap(null, C)
+ B.spring_trap(C, ignore_movetypes = TRUE)
qdel(src)
/obj/item/restraints/legcuffs/bola/energy/emp_act(severity)
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 80f392130647d..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
@@ -295,7 +333,7 @@
SIGNAL_HANDLER
if(isliving(AM))
var/mob/living/L = AM
- if(!(L.movement_type & (FLYING|FLOATING)) || L.buckled)
+ if(!(L.movement_type & MOVETYPES_NOT_TOUCHING_GROUND) || L.buckled)
playsound(src, 'sound/effects/glass_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE)
/obj/item/shard/plasma
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/bags.dm b/code/game/objects/items/storage/bags.dm
index 5afb8bd9eb7e4..1459b8775a25c 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -37,7 +37,7 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "trashbag"
item_state = "trashbag"
- worn_icon_state = "baguette"
+ worn_icon_state = "trashbag"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
w_class = WEIGHT_CLASS_BULKY
@@ -85,6 +85,7 @@
name = "trash bag of holding"
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
icon_state = "bluetrashbag"
+ worn_icon_state = "bluetrashbag"
item_flags = NO_MAT_REDEMPTION
/obj/item/storage/bag/trash/bluespace/ComponentInitialize()
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/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 83c65bd81ca00..cfbaa73a9a3c7 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -616,8 +616,9 @@
/obj/item/storage/box/syndie_kit/derringer
name = "'Infiltrator' pistol bundle"
- desc = "Contains a Syndicate issued coat pistol, and one Match grade .38-special speed loader."
+ desc = "Contains a Syndicate issued coat pistol, and one Match grade .357 speed loader."
/obj/item/storage/box/syndie_kit/derringer/PopulateContents()
new /obj/item/gun/ballistic/automatic/pistol/der38(src)
- new /obj/item/ammo_box/c38/match(src)
+ for (var/i in 1 to 6)
+ new /obj/item/ammo_casing/a357(src)
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/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index f48bcdf352da5..37987a431deb6 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -84,6 +84,7 @@
m180.Turn(180)
animate(L, transform = m180, time = 3)
L.pixel_y = L.base_pixel_y + PIXEL_Y_OFFSET_LYING
+ ADD_TRAIT(user, TRAIT_MOVE_UPSIDE_DOWN, REF(src))
else if (has_buckled_mobs())
for(var/mob/living/L in buckled_mobs)
user_unbuckle_mob(L, user)
@@ -129,6 +130,7 @@
m180.Turn(180)
animate(M, transform = m180, time = 3)
M.pixel_y = M.base_pixel_y + PIXEL_Y_OFFSET_LYING
+ REMOVE_TRAIT(M, TRAIT_MOVE_UPSIDE_DOWN, REF(src))
M.adjustBruteLoss(30)
src.visible_message("[M] falls free of [src]! ")
unbuckle_mob(M,force=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 cd6f467120bcc..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
@@ -84,7 +95,7 @@
/obj/structure/railing/CanPass(atom/movable/mover, border_dir)
. = ..()
if(border_dir & dir)
- return . || mover.throwing || mover.movement_type & (FLYING | FLOATING)
+ return . || mover.throwing || mover.movement_type & MOVETYPES_NOT_TOUCHING_GROUND
return TRUE
/obj/structure/railing/proc/on_exit(datum/source, atom/movable/leaving, direction)
@@ -102,7 +113,7 @@
if (leaving.throwing)
return
- if (leaving.movement_type & (PHASING | FLYING | FLOATING))
+ if (leaving.movement_type & (PHASING | MOVETYPES_NOT_TOUCHING_GROUND))
return
if (leaving.move_force >= MOVE_FORCE_EXTREMELY_STRONG)
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 544cb9177e98b..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(
@@ -317,7 +322,7 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/table)
check_break(M)
/obj/structure/table/glass/proc/check_break(mob/living/M)
- if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & (FLOATING|FLYING)))
+ if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
table_shatter(M)
/obj/structure/table/glass/proc/table_shatter(mob/living/victim)
@@ -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/_open.dm b/code/game/turfs/open/_open.dm
index 6b0f5a24a69ef..d6a6ae2dd1d22 100644
--- a/code/game/turfs/open/_open.dm
+++ b/code/game/turfs/open/_open.dm
@@ -99,7 +99,7 @@ CREATION_TEST_IGNORE_SELF(/turf/open)
/turf/open/indestructible/sound/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs)
. = ..()
- if(istype(arrived) && !(arrived.movement_type & (FLYING|FLOATING)))
+ if(istype(arrived) && !(arrived.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
playsound(src,sound,50,1)
/turf/open/indestructible/necropolis
diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm
index a31ddf285f808..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
@@ -125,7 +125,7 @@
else if (isliving(thing))
. = 1
var/mob/living/L = thing
- if(L.movement_type & (FLOATING|FLYING))
+ if(L.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
continue //YOU'RE FLYING OVER IT
var/buckle_check = L.buckled
if(isobj(buckle_check))
diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm
index 4cef4cfdf32af..005628458fbd8 100644
--- a/code/game/turfs/open/openspace.dm
+++ b/code/game/turfs/open/openspace.dm
@@ -31,6 +31,13 @@ CREATION_TEST_IGNORE_SUBTYPES(/turf/open/openspace)
/turf/open/openspace/airless
initial_gas_mix = AIRLESS_ATMOS
+/turf/open/openspace/Initialize(mapload)
+ . = ..()
+ var/area/our_area = loc
+ if(istype(our_area, /area/space))
+ force_no_gravity = TRUE
+ return INITIALIZE_HINT_LATELOAD
+
/turf/open/openspace/can_have_cabling()
if(locate(/obj/structure/lattice/catwalk, src))
return TRUE
diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm
index d4e29778c1bab..54672809445a6 100644
--- a/code/game/turfs/open/space/space.dm
+++ b/code/game/turfs/open/space/space.dm
@@ -38,6 +38,8 @@
z_eventually_space = TRUE
vis_flags = VIS_INHERIT_ID //when this be added to vis_contents of something it be associated with something on clicking, important for visualisation of turf in openspace and interraction with openspace that show you turf.
+ force_no_gravity = TRUE
+
/turf/open/space/basic/New() //Do not convert to Initialize
//This is used to optimize the map loader
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 94342afcd56a3..6a375c26b2091 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -72,6 +72,9 @@ CREATION_TEST_IGNORE_SELF(/turf)
/// See __DEFINES/construction.dm for RCD_MEMORY_*.
var/rcd_memory
+ ///whether or not this turf forces movables on it to have no gravity (unless they themselves have forced gravity)
+ var/force_no_gravity = FALSE
+
///Icon-smoothing variable to map a diagonal wall corner with a fixed underlay.
var/list/fixed_underlay = null
@@ -157,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)
@@ -298,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 e0282f9a7acea..fb40df2273fca 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 39d5113bfffd2..d7f62a6f72800 100644
--- a/code/modules/antagonists/blob/blobstrains/_reagent.dm
+++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm
@@ -7,12 +7,12 @@
/datum/blobstrain/reagent/attack_living(mob/living/L)
- var/mob_protection = L.get_permeability_protection()
+ var/mob_protection = L.getarmor(null, BIO) * 0.01
reagent.reaction_mob(L, VAPOR, BLOB_REAGENTATK_VOL, 1, mob_protection, overmind)
send_message(L)
/datum/blobstrain/reagent/blobbernaut_attack(mob/living/L)
- var/mob_protection = L.get_permeability_protection()
+ var/mob_protection = L.getarmor(null, BIO) * 0.01
reagent.reaction_mob(L, VAPOR, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, 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.
/datum/blobstrain/reagent/on_sporedeath(mob/living/spore)
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 4ec69ab6f6028..921848459051c 100644
--- a/code/modules/antagonists/blob/structures/_blob.dm
+++ b/code/modules/antagonists/blob/structures/_blob.dm
@@ -13,7 +13,7 @@
/// How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
var/point_return = 0
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
/// how much health this blob regens when pulsed
var/health_regen = BLOB_REGULAR_HP_REGEN
/// We got pulsed when?
@@ -32,6 +32,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)
@@ -259,7 +264,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 a5ac8edac0936..ef782f362a495 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 = BLOB_CORE_MAX_HP
max_hit_damage = BLOB_CORE_MAX_HP / 10
- 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
@@ -20,6 +20,10 @@
CREATION_TEST_IGNORE_SUBTYPES(/obj/structure/blob/special/core)
+/datum/armor/blob_core
+ fire = 75
+ acid = 90
+
/obj/structure/blob/special/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 ed31fbc1b0393..b49393b68e36c 100644
--- a/code/modules/antagonists/blob/structures/node.dm
+++ b/code/modules/antagonists/blob/structures/node.dm
@@ -6,7 +6,7 @@
max_integrity = BLOB_NODE_MAX_HP
max_hit_damage = BLOB_NODE_MAX_HP / 10
health_regen = BLOB_NODE_HP_REGEN
- 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
point_return = BLOB_REFUND_NODE_COST
claim_range = BLOB_NODE_CLAIM_RANGE
pulse_range = BLOB_NODE_PULSE_RANGE
@@ -15,6 +15,10 @@
max_spores = BLOB_NODE_MAX_SPORES
ignore_syncmesh_share = TRUE
+/datum/armor/blob_node
+ fire = 65
+ acid = 90
+
/obj/structure/blob/special/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 df76b0eb77250..ce14e1f192f5d 100644
--- a/code/modules/antagonists/blob/structures/shield.dm
+++ b/code/modules/antagonists/blob/structures/shield.dm
@@ -10,7 +10,12 @@
explosion_block = 3
point_return = BLOB_REFUND_STRONG_COST
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/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm
index 1c31d342fcf6d..30213fc58647b 100644
--- a/code/modules/antagonists/changeling/cellular_emporium.dm
+++ b/code/modules/antagonists/changeling/cellular_emporium.dm
@@ -29,7 +29,6 @@
var/can_readapt = changeling.canrespec
var/genetic_points_remaining = changeling.geneticpoints
var/absorbed_dna_count = changeling.absorbedcount
- var/true_absorbs = changeling.trueabsorbs
data["can_readapt"] = can_readapt
data["genetic_points_remaining"] = genetic_points_remaining
@@ -50,9 +49,8 @@
AL["helptext"] = initial(ability.helptext)
AL["owned"] = changeling.has_sting(ability)
var/req_dna = initial(ability.req_dna)
- var/req_absorbs = initial(ability.req_absorbs)
AL["dna_cost"] = dna_cost
- AL["can_purchase"] = ((req_absorbs <= true_absorbs) && (req_dna <= absorbed_dna_count) && (dna_cost <= genetic_points_remaining))
+ AL["can_purchase"] = ((req_dna <= absorbed_dna_count) && (dna_cost <= genetic_points_remaining))
abilities += list(AL)
diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm
index 6e0b61bf69e2b..a6a4ba185b8dc 100644
--- a/code/modules/antagonists/changeling/changeling.dm
+++ b/code/modules/antagonists/changeling/changeling.dm
@@ -16,7 +16,6 @@
var/list/stored_profiles = list() //list of datum/changelingprofile
var/datum/changelingprofile/first_prof = null
var/absorbedcount = 0
- var/trueabsorbs = 0//dna gained using absorb, not dna sting
var/chem_charges = 20
var/chem_storage = 75
var/chem_recharge_rate = 0.5
diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm
index 70c292f826735..91c676ddb9ab5 100644
--- a/code/modules/antagonists/changeling/changeling_power.dm
+++ b/code/modules/antagonists/changeling/changeling_power.dm
@@ -12,7 +12,6 @@
var/dna_cost = -1 //cost of the sting in dna points. 0 = auto-purchase (see changeling.dm), -1 = cannot be purchased
var/req_dna = 0 //amount of dna needed to use this ability. Changelings always have atleast 1
var/req_human = 0 //if you need to be human to use this ability
- var/req_absorbs = 0 //similar to req_dna, but only gained from absorbing, not DNA sting
///Maximum stat before the ability is blocked. For example, `UNCONSCIOUS` prevents it from being used when in hard crit or dead, while `DEAD` allows the ability to be used on any stat values.
var/req_stat = CONSCIOUS
var/ignores_fakedeath = FALSE // usable with the FAKEDEATH flag
@@ -66,9 +65,6 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
if(c.absorbedcount < req_dna)
to_chat(user, "We require at least [req_dna] sample\s of compatible DNA. ")
return 0
- if(c.trueabsorbs < req_absorbs)
- to_chat(user, "We require at least [req_absorbs] sample\s of DNA gained through our Absorb ability. ")
- return 0
if(req_stat < user.stat)
to_chat(user, "We are incapacitated. ")
return 0
diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm
index 8004936244458..aa4d401f0d3cc 100644
--- a/code/modules/antagonists/changeling/powers/absorb.dm
+++ b/code/modules/antagonists/changeling/powers/absorb.dm
@@ -56,7 +56,6 @@
if(!changeling.has_dna(target.dna))
changeling.add_new_profile(target)
- changeling.trueabsorbs++
if(user.nutrition < NUTRITION_LEVEL_WELL_FED)
user.set_nutrition(min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED))
diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm
index 5dea5ea3a8c3d..ba864cabef976 100644
--- a/code/modules/antagonists/changeling/powers/adrenaline.dm
+++ b/code/modules/antagonists/changeling/powers/adrenaline.dm
@@ -1,7 +1,7 @@
/datum/action/changeling/adrenaline
name = "Adrenaline Sacs"
desc = "We evolve additional sacs of adrenaline throughout our body. Costs 20 chemicals."
- helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious. Continued use poisons the body."
+ helptext = "Removes all stuns instantly and adds a short-term reduction in further stuns. Can be used while unconscious."
button_icon_state = "adrenaline"
chemical_cost = 20
dna_cost = 2
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 24bb4e51710e0..fff48015a8103 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -152,7 +152,7 @@
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL | ISWEAPON
w_class = WEIGHT_CLASS_HUGE
- force = 20 //this is an undroppable melee weapon. should not be better than the fireaxe
+ force = 30
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
@@ -161,7 +161,7 @@
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
sharpness = IS_SHARP
- bleed_force = BLEED_CUT
+ bleed_force = BLEED_DEEP_WOUND
var/can_drop = FALSE
var/fake = FALSE
@@ -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
- slowdown = 0.2
+ armor_type = /datum/armor/space_changeling
+ slowdown = 0.1
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)
@@ -453,11 +481,10 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/item/gun/magic/tentacle)
/datum/action/changeling/suit/armor
name = "Chitinous Armor"
desc = "We turn our skin into tough chitin to protect us from damage. Costs 20 chemicals."
- helptext = "Upkeep of the armor requires a low expenditure of chemicals. The armor provides decent protection against projectiles and some protection against melee attacks. Cannot be used in lesser form."
+ helptext = "Upkeep of the armor slows our rate of chemical production. The armor provides decent protection against projectiles and some protection against melee attacks. Cannot be used in lesser form."
button_icon_state = "chitinous_armor"
chemical_cost = 20
dna_cost = 2
- req_absorbs = 3
req_human = 1
recharge_slowdown = 0.125
@@ -473,12 +500,25 @@ 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
+ slowdown = 0
+
+
+/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)
. = ..()
@@ -492,9 +532,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/changeling/powers/teratoma.dm b/code/modules/antagonists/changeling/powers/teratoma.dm
index 30da334d3aa7e..ec5625feb81c4 100644
--- a/code/modules/antagonists/changeling/powers/teratoma.dm
+++ b/code/modules/antagonists/changeling/powers/teratoma.dm
@@ -1,3 +1,5 @@
+#define MAX_TERATOMA 2
+
/datum/action/changeling/teratoma
name = "Birth Teratoma"
desc = "Our form divides, creating an egg that will soon hatch into a living tumor, fixated on causing mayhem"
@@ -5,7 +7,7 @@
button_icon_state = "spread_infestation"
chemical_cost = 60
dna_cost = 2
- req_absorbs = 3
+ req_human = TRUE
//Reskinned monkey - teratoma, will burst out of the host, with the objective to cause chaos.
/datum/action/changeling/teratoma/sting_action(mob/user)
@@ -19,7 +21,20 @@
"You hear flesh tearing! ", COMBAT_MESSAGE_RANGE)
return FALSE //create_teratoma() handles the chemicals anyway so there is no reason to take them again
-/datum/action/changeling/teratoma/proc/create_teratoma(mob/user)
+/datum/action/changeling/teratoma/proc/create_teratoma(mob/living/carbon/human/user)
+ if (!istype(user))
+ return FALSE
+ if (!user.dna)
+ to_chat(user, "Our current form has insufficient genetic material to create a Teratoma. ")
+ return FALSE
+ var/terratoma_count = 0
+ for (var/mob/living/carbon/monkey/tumor/teratoma in GLOB.mob_living_list)
+ if (teratoma.creator_key != user.key || teratoma.stat == DEAD)
+ continue
+ terratoma_count ++
+ if (terratoma_count >= MAX_TERATOMA)
+ to_chat(user, "You don't have enough energy to birth a teratoma... ")
+ return FALSE
var/datum/antagonist/changeling/c = user.mind.has_antag_datum(/datum/antagonist/changeling)
c.chem_charges -= chemical_cost //I'm taking your chemicals hostage!
var/turf/A = get_turf(user)
@@ -28,11 +43,30 @@
to_chat(usr, "You fail at creating a tumor. Perhaps you should try again later? ")
c.chem_charges += chemical_cost //If it fails we want to refund the chemicals
return FALSE
+ // Rerun preconditions after sleeping
+ if (!user.dna)
+ to_chat(user, "Our current form has insufficient genetic material to create a Teratoma. ")
+ return FALSE
+ if (!user.key)
+ return FALSE
+ terratoma_count = 0
+ for (var/mob/living/carbon/monkey/tumor/teratoma in GLOB.mob_living_list)
+ if (teratoma.creator_key != user.key || teratoma.stat == DEAD)
+ continue
+ terratoma_count ++
+ if (terratoma_count >= MAX_TERATOMA)
+ to_chat(user, "You don't have enough energy to birth a teratoma... ")
+ return FALSE
var/mob/living/carbon/monkey/tumor/T = new /mob/living/carbon/monkey/tumor(A)
+ // Copies the DNA, so that you can find who caused it while causing some chaos
+ T.dna.copy_dna(user.dna)
+ T.creator_key = user.key
var/mob/dead/observer/C = pick(candidates)
T.key = C.key
var/datum/antagonist/teratoma/D = new
T.mind.add_antag_datum(D)
- to_chat(T, "You burst out from [user]'s chest! ")
+ to_chat(T, "You burst out from [user]'s chest! ")
SEND_SOUND(T, sound('sound/effects/blobattack.ogg'))
return TRUE
+
+#undef MAX_TERATOMA
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/clock_cult/traps/receivers/skewer.dm b/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm
index d9d66ea55c9f4..b66d84885dc28 100644
--- a/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm
+++ b/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm
@@ -27,7 +27,7 @@
var/target_stabbed = FALSE
density = TRUE
for(var/mob/living/M in get_turf(src))
- if(M.incorporeal_move || M.movement_type & (FLOATING|FLYING))
+ if(M.incorporeal_move || M.movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
continue
if(buckle_mob(M, TRUE))
target_stabbed = TRUE
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 2a4be278c87d6..858aeb3eeef9e 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/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
index 39399d9e8064a..94f2af29bb758 100644
--- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
+++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm
@@ -4,6 +4,7 @@
GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
/obj/machinery/field/containment,
/obj/machinery/power/supermatter_crystal,
+ /obj/machinery/gravity_generator,
/obj/machinery/doomsday_device,
/obj/machinery/nuclearbomb,
/obj/machinery/nuclearbomb/selfdestruct,
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 4769f01272687..db98df285b98e 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -175,7 +175,7 @@
if(armed)
if(ismob(AM))
var/mob/MM = AM
- if(!(MM.movement_type & (FLOATING|FLYING)))
+ if(!(MM.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.m_intent == MOVE_INTENT_RUN)
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/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index 057b15b91e30a..c19e6beeafd3f 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -139,7 +139,7 @@
suit_store = /obj/item/gun/energy/e_gun
glasses = /obj/item/clothing/glasses/meson/engine
back = /obj/item/storage/backpack/ert/engineer
- belt = /obj/item/storage/belt/utility/full
+ belt = /obj/item/storage/belt/utility/chief/full
l_pocket = /obj/item/rcd_ammo/large
l_hand = /obj/item/storage/firstaid/compact
backpack_contents = list(/obj/item/storage/box/survival/engineer=1,
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 6e3a364ab8ff3..2a14b37cddeb1 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -6,12 +6,26 @@
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
resistance_flags = FIRE_PROOF
+/obj/item/clothing/shoes/magboots/equipped(mob/user, slot)
+ . = ..()
+ if(slot & ITEM_SLOT_FEET)
+ update_gravity_trait(user)
+ else
+ REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
+
+/obj/item/clothing/shoes/magboots/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
+
+
+/datum/armor/shoes_magboots
+ bio = 90
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
@@ -22,7 +36,7 @@
attack_self(usr)
-/obj/item/clothing/shoes/magboots/attack_self(mob/user)
+/obj/item/clothing/shoes/magboots/attack_self(mob/living/user)
if(magpulse)
clothing_flags &= ~NOSLIP
slowdown = SHOES_SLOWDOWN
@@ -31,9 +45,8 @@
slowdown = slowdown_active
magpulse = !magpulse
icon_state = "[magboot_state][magpulse]"
- to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system. ")
- user.update_inv_shoes() //so our mob-overlays update
- user.update_gravity(user.has_gravity())
+ update_gravity_trait(user)
+ user.refresh_gravity()
update_action_buttons()
/obj/item/clothing/shoes/magboots/negates_gravity()
@@ -43,6 +56,13 @@
. = ..()
. += "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"]."
+///Adds/removes the gravity negation trait from the wearer depending on if the magpulse system is turned on.
+/obj/item/clothing/shoes/magboots/proc/update_gravity_trait(mob/user)
+ if(magpulse)
+ ADD_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
+ else
+ REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type)
+
/obj/item/clothing/shoes/magboots/advance
desc = "Advanced magnetic boots that have a lighter magnetic pull, placing less burden on the wearer."
@@ -65,10 +85,25 @@
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)
slowdown = SHOES_SLOWDOWN
else
@@ -77,7 +112,6 @@
icon_state = "[magboot_state][magpulse]"
to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system. ")
user.update_inv_shoes()
- user.update_gravity(user.has_gravity())
update_action_buttons()
/obj/item/clothing/shoes/magboots/crushing
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 06d90a692e9c7..193f81d915a8d 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/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm
index d43aedc2a225d..7e7c8e188e887 100644
--- a/code/modules/mapping/space_management/zlevel_manager.dm
+++ b/code/modules/mapping/space_management/zlevel_manager.dm
@@ -27,6 +27,7 @@
var/datum/space_level/S = new z_type(new_z, name, traits, orbital_body_type)
manage_z_level(S, filled_with_space = TRUE, contain_turfs = contain_turfs)
generate_linkages_for_z_level(new_z)
+ calculate_z_level_gravity(new_z)
SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_Z, S)
return S
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 b6510fad1b984..92cb51066ce07 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/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index 5ce3b199f2e90..04313e3f0c07c 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -32,6 +32,9 @@
GLOB.new_player_list -= src
return ..()
+/mob/dead/new_player/mob_negates_gravity()
+ return TRUE //no need to calculate if they have gravity.
+
/mob/dead/new_player/prepare_huds()
return
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 58be3435c9dac..b942c11698526 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -613,17 +613,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/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index b776e3bf4bc43..a4e01f2cd0d6f 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -1,6 +1,6 @@
/mob/living/carbon/slip(knockdown_amount, obj/O, lube, paralyze, force_drop)
- if(movement_type & (FLYING|FLOATING))
+ if(movement_type & MOVETYPES_NOT_TOUCHING_GROUND)
return FALSE
if((lube & NO_SLIP_ON_CATWALK) && (locate(/obj/structure/lattice/catwalk) in get_turf(src)))
return FALSE
@@ -63,9 +63,9 @@
REMOVE_TRAIT(src, TRAIT_FLOORED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT)
-/mob/living/carbon/on_movement_type_flag_disabled(datum/source, flag)
+/mob/living/carbon/on_movement_type_flag_disabled(datum/source, flag, old_movement_type)
. = ..()
- if(flag & (FLYING | FLOATING) && !(movement_type & (FLYING | FLOATING)))
+ if(old_movement_type & (FLYING | FLOATING) && !(movement_type & (FLYING | FLOATING)))
var/limbless_slowdown = 0
if(usable_legs < default_num_legs)
limbless_slowdown += (default_num_legs - usable_legs) * 3
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index 7de8174bf834f..7fcbcb8c6f9f4 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -12,6 +12,11 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
. = ..()
remove_from_all_data_huds()
+
+// We don't want your dummy floating up and down in the preference menu.
+/mob/living/carbon/human/dummy/mob_negates_gravity()
+ return TRUE
+
/mob/living/carbon/human/dummy/prepare_data_huds()
return
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.dm b/code/modules/mob/living/carbon/human/species.dm
index 357a1ab125c51..6934699f347ba 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -2405,6 +2405,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
if(isturf(H.loc))
var/turf/T = H.loc
T.Entered(H)
+ H.refresh_gravity()
///Calls the DMI data for a custom icon for a given bodypart from the Species Datum.
/datum/species/proc/get_custom_icons(var/part)
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 9c96f10a13218..89f4432600034 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -859,7 +859,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
@@ -869,6 +869,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 c50d7d65ac853..b24357005f083 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/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index ce45170756a7e..8832cebaef6e0 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -234,6 +234,21 @@ CREATION_TEST_IGNORE_SUBTYPES(/mob/living/carbon/monkey)
bodyparts = list(/obj/item/bodypart/chest/monkey/teratoma, /obj/item/bodypart/head/monkey/teratoma, /obj/item/bodypart/l_arm/monkey/teratoma,
/obj/item/bodypart/r_arm/monkey/teratoma, /obj/item/bodypart/r_leg/monkey/teratoma, /obj/item/bodypart/l_leg/monkey/teratoma)
ai_controller = null
+ var/creator_key = null
+
+/mob/living/carbon/monkey/tumor/death(gibbed)
+ . = ..()
+ for (var/mob/living/creator in GLOB.player_list)
+ if (creator.key != creator_key)
+ continue
+ if (creator.stat == DEAD)
+ return
+ if (!creator.mind)
+ return
+ if (!creator.mind.has_antag_datum(/datum/antagonist/changeling))
+ return
+ to_chat(creator, "We gain the energy to birth another Teratoma... ")
+ return
/datum/dna/tumor
species = new /datum/species/teratoma
diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm
index b3608f641cd33..1c1b9752b350b 100644
--- a/code/modules/mob/living/init_signals.dm
+++ b/code/modules/mob/living/init_signals.dm
@@ -41,6 +41,16 @@
RegisterSignal(src, COMSIG_MOVETYPE_FLAG_ENABLED, PROC_REF(on_movement_type_flag_enabled))
RegisterSignal(src, COMSIG_MOVETYPE_FLAG_DISABLED, PROC_REF(on_movement_type_flag_disabled))
+ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NEGATES_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_NEGATES_GRAVITY)), PROC_REF(on_negate_gravity))
+ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_IGNORING_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_IGNORING_GRAVITY)), PROC_REF(on_ignore_gravity))
+ RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FORCED_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_FORCED_GRAVITY)), PROC_REF(on_force_gravity))
+ // We hook for forced grav changes from our turf and ourselves
+ var/static/list/loc_connections = list(
+ SIGNAL_ADDTRAIT(TRAIT_FORCED_GRAVITY) = PROC_REF(on_loc_force_gravity),
+ SIGNAL_REMOVETRAIT(TRAIT_FORCED_GRAVITY) = PROC_REF(on_loc_force_gravity),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
///Called when TRAIT_KNOCKEDOUT is added to the mob.
/mob/living/proc/on_knockedout_trait_gain(datum/source)
SIGNAL_HANDLER
@@ -63,6 +73,29 @@
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, TRAIT_DEATHCOMA)
+/// Called when [TRAIT_NEGATES_GRAVITY] is gained or lost
+/mob/living/proc/on_negate_gravity(datum/source)
+ SIGNAL_HANDLER
+ if(!isgroundlessturf(loc))
+ if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY))
+ ADD_TRAIT(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION)
+ else
+ REMOVE_TRAIT(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION)
+
+/// Called when [TRAIT_IGNORING_GRAVITY] is gained or lost
+/mob/living/proc/on_ignore_gravity(datum/source)
+ SIGNAL_HANDLER
+ refresh_gravity()
+
+/// Called when [TRAIT_FORCED_GRAVITY] is gained or lost
+/mob/living/proc/on_force_gravity(datum/source)
+ SIGNAL_HANDLER
+ refresh_gravity()
+
+/// Called when our loc's [TRAIT_FORCED_GRAVITY] is gained or lost
+/mob/living/proc/on_loc_force_gravity(datum/source)
+ SIGNAL_HANDLER
+ refresh_gravity()
///Called when TRAIT_IMMOBILIZED is added to the mob.
/mob/living/proc/on_immobilized_trait_gain(datum/source)
@@ -178,11 +211,11 @@
clear_alert("succumb")
///From [element/movetype_handler/on_movement_type_trait_gain()]
-/mob/living/proc/on_movement_type_flag_enabled(datum/source, trait)
+/mob/living/proc/on_movement_type_flag_enabled(datum/source, trait, flag, old_movement_type)
SIGNAL_HANDLER
update_movespeed(FALSE)
///From [element/movetype_handler/on_movement_type_trait_loss()]
-/mob/living/proc/on_movement_type_flag_disabled(datum/source, trait)
+/mob/living/proc/on_movement_type_flag_disabled(datum/source, trait, flag, old_movement_type)
SIGNAL_HANDLER
update_movespeed(FALSE)
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 5c9a2c009fd4f..0317e09a38d16 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -122,31 +122,21 @@
/mob/living/proc/update_damage_hud()
return
-/mob/living/proc/handle_gravity(delta_time, times_fired)
- var/gravity = has_gravity()
- update_gravity(gravity)
-
- if(gravity > STANDARD_GRAVITY)
- gravity_animate()
- handle_high_gravity(gravity, delta_time, times_fired)
- else if(get_filter("gravity"))
- remove_filter("gravity")
+/mob/living/proc/handle_gravity(seconds_per_tick, times_fired)
+ if(gravity_state > STANDARD_GRAVITY)
+ handle_high_gravity(gravity_state, seconds_per_tick, times_fired)
/mob/living/proc/gravity_animate()
if(!get_filter("gravity"))
add_filter("gravity",1,list("type"="motion_blur", "x"=0, "y"=0))
- INVOKE_ASYNC(src, PROC_REF(gravity_pulse_animation))
-
-/mob/living/proc/gravity_pulse_animation()
- animate(get_filter("gravity"), y = 1, time = 10)
- sleep(10)
- animate(get_filter("gravity"), y = 0, time = 10)
+ animate(get_filter("gravity"), y = 1, time = 10, loop = -1)
+ animate(y = 0, time = 10)
-/mob/living/proc/handle_high_gravity(gravity, delta_time, times_fired)
+/mob/living/proc/handle_high_gravity(gravity, seconds_per_tick, times_fired)
if(gravity < GRAVITY_DAMAGE_THRESHOLD) //Aka gravity values of 3 or more
return
var/grav_strength = gravity - GRAVITY_DAMAGE_THRESHOLD
- adjustBruteLoss(min(GRAVITY_DAMAGE_SCALING * grav_strength, GRAVITY_DAMAGE_MAXIMUM) * delta_time)
+ adjustBruteLoss(min(GRAVITY_DAMAGE_SCALING * grav_strength, GRAVITY_DAMAGE_MAXIMUM) * seconds_per_tick)
#undef BODYTEMP_DIVISOR
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5d82c4a7318b2..e182215eff8d8 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -24,6 +24,7 @@
// it prevents 'GLOB.poi_list' being glitched. without this, it will show xeno(or some mobs) twice in orbit panel.
//color correction
RegisterSignal(src, COMSIG_MOVABLE_ENTERED_AREA, PROC_REF(apply_color_correction))
+ gravity_setup()
/mob/living/ComponentInitialize()
. = ..()
@@ -955,25 +956,51 @@
/mob/living/proc/get_visible_name()
return name
-/mob/living/update_gravity(has_gravity)
- . = ..()
- if(!SSticker.HasRoundStarted())
- return
- var/was_weightless = alerts["gravity"] && istype(alerts["gravity"], /atom/movable/screen/alert/weightless)
- if(has_gravity)
- if(has_gravity == 1)
- clear_alert("gravity")
- else
- if(has_gravity >= GRAVITY_DAMAGE_THRESHOLD)
- throw_alert("gravity", /atom/movable/screen/alert/veryhighgravity)
- else
- throw_alert("gravity", /atom/movable/screen/alert/highgravity)
- if(was_weightless)
- REMOVE_TRAIT(src, TRAIT_MOVE_FLOATING, NO_GRAVITY_TRAIT)
+/mob/living/proc/update_gravity(gravity)
+ // Handle movespeed stuff
+ var/speed_change = max(0, gravity - STANDARD_GRAVITY)
+ if(speed_change)
+ add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown=speed_change)
else
- throw_alert("gravity", /atom/movable/screen/alert/weightless)
- if(!was_weightless)
- ADD_TRAIT(src, TRAIT_MOVE_FLOATING, NO_GRAVITY_TRAIT)
+ remove_movespeed_modifier(/datum/movespeed_modifier/gravity)
+
+ // Time to add/remove gravity alerts. sorry for the mess it's gotta be fast
+ var/atom/movable/screen/alert/gravity_alert = alerts["gravity"]
+ switch(gravity)
+ if(-INFINITY to NEGATIVE_GRAVITY)
+ if(!istype(gravity_alert, /atom/movable/screen/alert/negative))
+ throw_alert("gravity", /atom/movable/screen/alert/negative)
+ ADD_TRAIT(src, TRAIT_MOVE_UPSIDE_DOWN, NEGATIVE_GRAVITY_TRAIT)
+ var/matrix/flipped_matrix = transform
+ flipped_matrix.b = -flipped_matrix.b
+ flipped_matrix.e = -flipped_matrix.e
+ animate(src, transform = flipped_matrix, pixel_y = pixel_y+4, time = 0.5 SECONDS, easing = EASE_OUT, flags = ANIMATION_PARALLEL)
+ base_pixel_y += 4
+ if(NEGATIVE_GRAVITY + 0.01 to 0)
+ if(!istype(gravity_alert, /atom/movable/screen/alert/weightless))
+ throw_alert("gravity", /atom/movable/screen/alert/weightless)
+ ADD_TRAIT(src, TRAIT_MOVE_FLOATING, NO_GRAVITY_TRAIT)
+ if(0.01 to STANDARD_GRAVITY)
+ if(gravity_alert)
+ clear_alert("gravity")
+ if(STANDARD_GRAVITY + 0.01 to GRAVITY_DAMAGE_THRESHOLD - 0.01)
+ throw_alert("gravity", /atom/movable/screen/alert/highgravity)
+ if(GRAVITY_DAMAGE_THRESHOLD to INFINITY)
+ throw_alert("gravity", /atom/movable/screen/alert/veryhighgravity)
+
+ // If we had no gravity alert, or the same alert as before, go home
+ if(!gravity_alert || alerts["gravity"] == gravity_alert)
+ return
+ // By this point we know that we do not have the same alert as we used to
+ if(istype(gravity_alert, /atom/movable/screen/alert/weightless))
+ REMOVE_TRAIT(src, TRAIT_MOVE_FLOATING, NO_GRAVITY_TRAIT)
+ if(istype(gravity_alert, /atom/movable/screen/alert/negative))
+ REMOVE_TRAIT(src, TRAIT_MOVE_UPSIDE_DOWN, NEGATIVE_GRAVITY_TRAIT)
+ var/matrix/flipped_matrix = transform
+ flipped_matrix.b = -flipped_matrix.b
+ flipped_matrix.e = -flipped_matrix.e
+ animate(src, transform = flipped_matrix, pixel_y = pixel_y-4, time = 0.5 SECONDS, easing = EASE_OUT, flags = ANIMATION_PARALLEL)
+ base_pixel_y -= 4
// The src mob is trying to strip an item from someone
// Override if a certain type of mob should be behave differently when stripping items (can't, for example)
@@ -1097,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/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 7e5917bde22ba..c7b849c0c4b69 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -169,3 +169,6 @@
///The x amount a mob's sprite should be offset due to the current position they're in
var/body_position_pixel_y_offset = 0
+ /// What our current gravity state is. Used to avoid duplicate animates and such
+ var/gravity_state = null
+
diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm
index eaf9b84962334..25b8815ef6b45 100644
--- a/code/modules/mob/living/living_movement.dm
+++ b/code/modules/mob/living/living_movement.dm
@@ -1,8 +1,60 @@
-/mob/living/Moved()
+/mob/living/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
. = ..()
update_turf_movespeed(loc)
update_looking_move()
+ if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY))
+ if(!isgroundlessturf(loc))
+ ADD_TRAIT(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION)
+ else
+ REMOVE_TRAIT(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION)
+ var/turf/old_turf = get_turf(old_loc)
+ var/turf/new_turf = get_turf(src)
+ // If we're moving to/from nullspace, refresh
+ // Easier then adding nullchecks to all this shit, and technically right since a null turf means nograv
+ if(isnull(old_turf) || isnull(new_turf))
+ if(!QDELING(src))
+ refresh_gravity()
+ return
+ // If the turf gravity has changed, then it's possible that our state has changed, so update
+ if(HAS_TRAIT(old_turf, TRAIT_FORCED_GRAVITY) != HAS_TRAIT(new_turf, TRAIT_FORCED_GRAVITY) || new_turf.force_no_gravity != old_turf.force_no_gravity)
+ refresh_gravity()
+
+ // Going to do area gravity checking here
+ var/area/old_area = get_area(old_turf)
+ var/area/new_area = get_area(new_turf)
+ // If the area gravity has changed, then it's possible that our state has changed, so update
+ if(old_area.has_gravity != new_area.has_gravity)
+ refresh_gravity()
+
+/mob/living/onTransitZ(old_z, new_z, same_z_layer, notify_contents)
+ . = ..()
+
+ if(!old_z || !new_z || SSmapping.gravity_by_z_level[old_z] != SSmapping.gravity_by_z_level[new_z])
+ refresh_gravity()
+
+/// Living Mob use event based gravity
+/// We check here to ensure we haven't dropped any gravity changes
+/mob/living/proc/gravity_setup()
+ on_negate_gravity(src)
+ refresh_gravity()
+
+/// Handles gravity effects. Call if something about our gravity has potentially changed!
+/mob/living/proc/refresh_gravity()
+ var/old_grav_state = gravity_state
+ gravity_state = has_gravity()
+ if(gravity_state == old_grav_state)
+ return
+
+ update_gravity(gravity_state)
+
+ if(gravity_state > STANDARD_GRAVITY)
+ gravity_animate()
+ else if(old_grav_state > STANDARD_GRAVITY)
+ remove_filter("gravity")
+
+/mob/living/mob_negates_gravity()
+ return HAS_TRAIT_FROM(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION)
/mob/living/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 5b9b94f1b2380..64c36e7f89b14 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -4,8 +4,6 @@
//Being dead doesn't mean your temperature never changes
//who did this shit I hate you
- update_gravity(has_gravity())
-
handle_status_effects(delta_time, times_fired)
handle_traits(delta_time, times_fired)
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 6f68d48e5b565..8c52e0a1951fd 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -319,16 +319,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/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 69b03d9785616..81cb608e578ca 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -61,11 +61,11 @@
time += delta_time
if(time >= EGG_INCUBATION_TIME)
Pop()
- Remove(owner)
+ Remove(owner.loc)
qdel(src)
/obj/item/organ/body_egg/changeling_egg/proc/Pop()
- var/mob/living/carbon/monkey/M = new(owner)
+ var/mob/living/carbon/monkey/M = new(owner.loc)
for(var/obj/item/organ/I in src)
I.Insert(M, 1)
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
index 9511e696a23d4..dba161c6e2d0e 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm
@@ -58,7 +58,7 @@
/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE)
if(iscarbon(target) && blocked < 100)
var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target))
- B.spring_trap(null, target)
+ B.spring_trap(target)
return ..()
/obj/item/restraints/legcuffs/beartrap/mega_arachnid
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/mob/living/simple_animal/hostile/retaliate/nymph.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/nymph.dm
index 6ed5076220c3b..19d11f929cbcb 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/nymph.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/nymph.dm
@@ -172,21 +172,29 @@
grown_message_sent = TRUE
/mob/living/simple_animal/hostile/retaliate/nymph/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
+ SIGNAL_HANDLER
+ INVOKE_ASYNC(src, PROC_REF(nymph_assimilation), source, arrived)
+
+/mob/living/simple_animal/hostile/retaliate/nymph/proc/nymph_assimilation(datum/source, atom/movable/arrived)
if(isdiona(arrived))
if(mind != null || stat == DEAD || is_drone) //Does the nymph on the ground have a mind, dead or a drone?
return // If so, ignore the diona
- var/mob/living/carbon/human/H = arrived
- var/list/limbs_to_heal = H.get_missing_limbs()
+ var/mob/living/carbon/human/arrived_diona = arrived
+ var/list/limbs_to_heal = arrived_diona.get_missing_limbs()
if(!LAZYLEN(limbs_to_heal))
return
- playsound(H, 'sound/creatures/venus_trap_hit.ogg', 25, 1)
+ toggle_ai(AI_OFF)
+ if(!do_after(arrived_diona, 5 SECONDS, source, progress = TRUE))
+ toggle_ai(AI_IDLE)
+ return
+ playsound(arrived_diona, 'sound/creatures/venus_trap_hit.ogg', 25, 1)
var/obj/item/bodypart/healed_limb = pick(limbs_to_heal)
- H.regenerate_limb(healed_limb)
- for(var/obj/item/bodypart/body_part in H.bodyparts)
+ arrived_diona.regenerate_limb(healed_limb)
+ for(var/obj/item/bodypart/body_part in arrived_diona.bodyparts)
if(body_part.body_zone == healed_limb)
body_part.brute_dam = brute_damage
body_part.burn_dam = fire_damage
- balloon_alert(H, "[H] assimilates [src]")
+ balloon_alert(arrived_diona, "[arrived_diona] assimilates [src]")
QDEL_NULL(src)
/mob/living/simple_animal/hostile/retaliate/nymph/handle_mutations_and_radiation()
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 1dfd1b243f3ac..92d000b3bf62a 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -394,14 +394,14 @@
..()
if (cooldown < world.time)
cooldown = world.time + 300
- playsound(get_turf(src), 'sound/creatures/heavysight1.ogg', 80, 0, 0)
+ playsound(get_turf(src), 'sound/creatures/heavysight1.ogg', 30, 0, 0)
/mob/living/simple_animal/hostile/syndicate/heavy/OpenFire(atom/A)
- playsound(get_turf(src), 'sound/weapons/heavyminigunstart.ogg', 80, 0, 0)
+ playsound(get_turf(src), 'sound/weapons/heavyminigunstart.ogg', 30, 0, 0)
move_to_delay = 6//slowdown when shoot
speed = 30
sleep(15)
- playsound(get_turf(src), 'sound/weapons/heavyminigunshoot.ogg', 90, 0, 0)
+ playsound(get_turf(src), 'sound/weapons/heavyminigunshoot.ogg', 30, 0, 0)
if(CheckFriendlyFire(A))
return
if(!(simple_mob_flags & SILENCE_RANGED_MESSAGE))
@@ -413,10 +413,10 @@
else
Shoot(A)
ranged_cooldown = world.time + ranged_cooldown_time
- playsound(get_turf(src), 'sound/weapons/heavyminigunstop.ogg', 80, 0, 0)
+ playsound(get_turf(src), 'sound/weapons/heavyminigunstop.ogg', 30, 0, 0)
move_to_delay = initial(move_to_delay)//restore speed
speed = initial(speed)
/mob/living/simple_animal/hostile/syndicate/heavy/death(gibbed)
- playsound(get_turf(src), 'sound/creatures/heavydeath1.ogg', 80, TRUE, 0)
+ playsound(get_turf(src), 'sound/creatures/heavydeath1.ogg', 30, TRUE, 0)
..()
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index b089c1bde7df3..289f149f9561e 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -354,6 +354,9 @@
continue
return rebound
+/mob/has_gravity(turf/gravity_turf)
+ return mob_negates_gravity() || ..()
+
/**
* Does this mob ignore gravity
*/
@@ -372,14 +375,6 @@
/mob/proc/slip(knockdown, paralyze, forcedrop, w_amount, obj/O, lube)
return
-/// Update the gravity status of this mob
-/mob/proc/update_gravity(has_gravity, override=FALSE)
- var/speed_change = max(0, has_gravity - STANDARD_GRAVITY)
- if(!speed_change)
- remove_movespeed_modifier(/datum/movespeed_modifier/gravity)
- else
- add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown=speed_change)
-
//bodypart selection verbs - Cyberboss
//8:repeated presses toggles through head - eyes - mouth
//4: r-arm 5: chest 6: l-arm
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/movespeed/modifiers/mobs.dm b/code/modules/movespeed/modifiers/mobs.dm
index 7a4e3ba20d20b..c6f604069e801 100644
--- a/code/modules/movespeed/modifiers/mobs.dm
+++ b/code/modules/movespeed/modifiers/mobs.dm
@@ -83,6 +83,7 @@
/datum/movespeed_modifier/limbless
variable = TRUE
movetypes = GROUND
+ blacklisted_movetypes = FLOATING|FLYING
flags = IGNORE_NOSLOW
/datum/movespeed_modifier/simplemob_varspeed
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/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 4f91bdd2f00c7..1106020078cd1 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -187,6 +187,20 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
// Interaction
+/obj/machinery/gravity_generator/main/examine(mob/user)
+ . = ..()
+ if(!(machine_stat & BROKEN))
+ return
+ switch(broken_state)
+ if(GRAV_NEEDS_SCREWDRIVER)
+ . += "The entire frame is barely holding together, the screws need to be refastened. "
+ if(GRAV_NEEDS_WELDING)
+ . += "There's lots of broken seals on the framework, it could use some welding . "
+ if(GRAV_NEEDS_PLASTEEL)
+ . += "Some of this damaged plating needs full replacement. 10 plasteel> should be enough. "
+ if(GRAV_NEEDS_WRENCH)
+ . += "The new plating just needs to be bolted into place now. "
+
// Fixing the gravity generator.
/obj/machinery/gravity_generator/main/attackby(obj/item/I, mob/user, params)
switch(broken_state)
@@ -365,11 +379,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
/obj/machinery/gravity_generator/main/proc/shake_everyone()
var/turf/T = get_turf(src)
var/sound/alert_sound = sound('sound/effects/alert.ogg')
- for(var/i in GLOB.mob_list)
- var/mob/M = i
+ for(var/mobs in GLOB.mob_list)
+ var/mob/M = mobs
if(M.get_virtual_z_level() != get_virtual_z_level() && !(ztrait && SSmapping.level_trait(z, ztrait) && SSmapping.level_trait(M.z, ztrait)))
continue
- M.update_gravity(M.has_gravity())
+ if(isliving(M))
+ var/mob/living/grav_update = M
+ grav_update.refresh_gravity()
if(M.client)
shake_camera(M, 15, 1)
M.playsound_local(T, null, 100, 1, 0.5, S = alert_sound)
@@ -399,6 +415,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
GLOB.gravity_generators["[theZ]"] |= src
else
GLOB.gravity_generators["[theZ]"] -= src
+ SSmapping.calculate_z_level_gravity(z)
/obj/machinery/gravity_generator/main/proc/change_setting(value)
if(value != setting)
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/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index 09fc551674b9c..bced65bf40e21 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -77,12 +77,6 @@
. = ..()
create_reagents(reagent_amount, OPENCONTAINER)
-/obj/item/ammo_casing/c38/emp
- name = ".38 'BLK_OUT' bullet casing"
- desc = "A specialized .38 bullet casing that releases a small electromagnetic burst on impact."
- icon_state = "sS-casing"
- projectile_type = /obj/projectile/bullet/c38/emp
-
/obj/item/ammo_casing/c38/improv
name = "improv .38 bullet casing"
desc = "An improvised .38 bullet casing."
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index ee7bb50baaa99..6d3bc7def54f6 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -55,11 +55,6 @@
desc = "Designed to quickly reload revolvers. Blister rounds can be injected with up to 10 units of chemicals."
ammo_type = /obj/item/ammo_casing/c38/dart
-/obj/item/ammo_box/c38/emp
- name = "speed loader (.38 BLK_OUT)"
- desc = "Designed to quickly reload revolvers. 'BLK_OUT' rounds unleash a small EMP on impact."
- ammo_type = /obj/item/ammo_casing/c38/emp
-
/obj/item/ammo_box/c38/mime
name = "speed loader (.38 finger)"
max_ammo = 6
diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
index 66fcc363c51be..cfabf97f885c9 100644
--- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm
+++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm
@@ -20,8 +20,8 @@
/obj/item/ammo_box/magazine/internal/der38
name = "derringer internal chambering"
- ammo_type = /obj/item/ammo_casing/c38/match
- caliber = "38"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = "357"
max_ammo = 2
/obj/item/ammo_box/magazine/internal/der38/twelveshooter
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 8d613f010e14f..7ce006a562bd6 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -31,7 +31,7 @@
/obj/item/gun/ballistic/automatic/pistol/der38
name = "palm pistol"
- desc = "An 'Infiltrator' double-barreled derringer, chambered in .38-special. Not the best for head-on engagements."
+ desc = "An 'Infiltrator' double-barreled derringer, chambered in the powerful .357. Useful in a pinch but inadequate for longer engagements."
icon_state = "derringer"
w_class = WEIGHT_CLASS_SMALL
item_state = null //Too small to show in hand, unless examined
@@ -47,8 +47,6 @@
fire_sound_volume = 60
spread = 18 //Innate spread of 18 degrees, unwielded spread of 48; Stechkin is unwielded 40
weapon_weight = WEAPON_LIGHT * 0.5 //Equivelant weight to 0.5 (Stechkin has weight 1)
- wild_spread = TRUE
- wild_factor = 0.70 //Minimum spread is 70% of spread value
equip_time = 0
has_weapon_slowdown = FALSE
diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm
index 85ceca64e6a12..3e51bf3ed45e5 100644
--- a/code/modules/projectiles/projectile/bullets/revolver.dm
+++ b/code/modules/projectiles/projectile/bullets/revolver.dm
@@ -89,15 +89,6 @@
var/mob/living/M = target
M.adjust_bodytemperature(((100-blocked)/100)*(temperature - M.bodytemperature))
-/obj/projectile/bullet/c38/emp
- name = ".38 BLK_OUT bullet"
- damage = 8
- ricochets_max = 0
-
-/obj/projectile/bullet/c38/emp/on_hit(atom/target)
- . = ..()
- empulse(target, 0, 2)
-
/obj/projectile/bullet/c38/improv
damage = 25
ricochets_max = 1
diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm
index 04e496aa21786..5a3bdb9df2b5a 100644
--- a/code/modules/projectiles/projectile/energy/net_snare.dm
+++ b/code/modules/projectiles/projectile/energy/net_snare.dm
@@ -83,7 +83,7 @@
new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc))
else if(iscarbon(target))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy(get_turf(target))
- B.spring_trap(null, target)
+ B.spring_trap(target)
. = ..()
/obj/projectile/energy/trap/on_range()
@@ -104,7 +104,7 @@
qdel(src)
if(iscarbon(target))
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(target))
- B.spring_trap(null, target)
+ B.spring_trap(target)
QDEL_IN(src, 10)
. = ..()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 3d44cafa47450..ff8f97dfb8b9a 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -632,7 +632,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/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 3a107381ce6a6..72706586a9c2e 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -275,10 +275,9 @@
juice_item(juiced_item, user)
/obj/machinery/reagentgrinder/proc/juice_item(obj/item/juiced_item, mob/user) //Juicing results can be found in respective object definitions
- if(juiced_item.on_juice(src) == -1)
+ if(!juiced_item.juice(beaker, user))
to_chat(usr, "[src] shorts out as it tries to juice up [juiced_item], and transfers it back to storage. ")
return
- beaker.reagents.add_reagent_list(juiced_item.juice_results)
remove_object(juiced_item)
/obj/machinery/reagentgrinder/proc/grind(mob/user)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index ba471073b964e..691b03d100e85 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -92,7 +92,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/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 9a67c1831c2e0..cc44865410554 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -1499,7 +1499,7 @@
/datum/reagent/medicine/changelinghaste
name = "Changeling Haste"
- description = "Drastically increases movement speed, but deals toxin damage."
+ description = "Drastically increases movement speed."
color = "#AE151D"
chem_flags = CHEMICAL_RNG_GENERAL | CHEMICAL_RNG_FUN | CHEMICAL_RNG_BOTANY
metabolization_rate = 2.5 * REAGENTS_METABOLISM
@@ -1512,11 +1512,6 @@
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
..()
-/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired)
- metabolizer.adjustToxLoss(2 * REM * delta_time, 0)
- ..()
- return TRUE
-
/datum/reagent/medicine/corazone
// Heart attack code will not do damage if corazone is present
// because it's SPACE MAGIC ASPIRIN
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 74732a9079636..d2f76774b3004 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.dm b/code/modules/shuttle/shuttle.dm
index 0b6df82332fec..b9c133c5fbdb3 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -61,8 +61,8 @@ CREATION_TEST_IGNORE_SUBTYPES(/obj/docking_port)
else
return QDEL_HINT_LETMELIVE
-/obj/docking_port/has_gravity(turf/T)
- return FALSE
+/obj/docking_port/has_gravity(turf/current_turf)
+ return TRUE
/obj/docking_port/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir, armour_penetration = 0)
return
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/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 3f79c18d1cc59..8516117bdde06 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -139,7 +139,7 @@
/obj/item/meteor_shield/ComponentInitialize()
. = ..()
- AddComponent(/datum/component/deployable, /obj/machinery/satellite/meteor_shield, time_to_deploy = 10 SECONDS)
+ AddComponent(/datum/component/deployable, /obj/machinery/satellite/meteor_shield, time_to_deploy = 0)
/obj/machinery/satellite/meteor_shield
name = "\improper Meteor Shield Satellite"
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/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 750ed038d02c4..e2a89acfc2f60 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -697,8 +697,9 @@ GLOBAL_LIST_INIT(illegal_tech_blacklist, typecacheof(list(
/datum/uplink_item/dangerous/derringer
name = "'Infiltrator' Coat Pistol"
- desc = "For the deeply embedded agent; a very compact dual-barreled handgun chambered in .38-special. Compatible with \
- standard production NT speed loaders. Loaded with .38 Match ammunition and includes a spare speedloader."
+ desc = "For the deeply embedded agent; a very compact dual-barreled handgun chambered with highly powerful .357 rounds. \
+ It's small ammo capacity and difficult to obtain ammo make it poor at prolonged engagements, but it's saved the lives of \
+ many agents that find themselves in sticky situations."
item = /obj/item/storage/box/syndie_kit/derringer
cost = 4
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -1030,60 +1031,6 @@ GLOBAL_LIST_INIT(illegal_tech_blacklist, typecacheof(list(
illegal_tech = FALSE
contents_are_illegal_tech = FALSE
-/datum/uplink_item/ammo/c38
- name = ".38-special Speed Loader"
- desc = "A standard issue .38-special speed loader, for use with the Detective's revolver or 'Infiltrator' coat pistol."
- item = /obj/item/ammo_box/c38
- cost = 1
- purchasable_from = ~UPLINK_CLOWN_OPS
- illegal_tech = FALSE
- contents_are_illegal_tech = FALSE
-
-/datum/uplink_item/ammo/c38blister
- name = ".38-special 'Blister' Speed Loader"
- desc = "For when you can't deside between a coat pistol and a dart pistol! These 6 cartridges can \
- be injected with up to 10 units of your favorite poison for remote application via sidearm."
- item = /obj/item/ammo_box/c38/dart
- cost = 1
- purchasable_from = ~UPLINK_CLOWN_OPS
- illegal_tech = FALSE
- contents_are_illegal_tech = FALSE
-
-/datum/uplink_item/ammo/c38dumdum
- name = ".38-special DumDum Speed Loader"
- desc = "6 specialized fragmenting .38-special catridges, excellent for dispatching unarmored targets. \
- Shrapnel can embed within the victim and provide a debilitating effect. Not advised for use \
- against armored targets."
- item = /obj/item/ammo_box/c38/dumdum
- cost = 1
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/ammo/c38iceblox
- name = ".38-special Iceblox Speed Loader"
- desc = "6 .38-special Iceblox cartridges, 'guaranteed' to free your target to the core."
- item = /obj/item/ammo_box/c38/iceblox
- cost = 1
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/ammo/c38hotshot
- name = ".38-special Hot Shot Speed Loader"
- desc = "6 .38-special Hot Shot cartridges. Set your target ablaze with this specialized thermal payload."
- item = /obj/item/ammo_box/c38/hotshot
- cost = 1
- purchasable_from = ~UPLINK_CLOWN_OPS
- illegal_tech = FALSE
- contents_are_illegal_tech = FALSE
-
-/datum/uplink_item/ammo/c38emp
- name = ".38-special 'BLK_OUT' Speed Loader"
- desc = "6 specialized 'anti-silicon' .38-special cartridges that release a minor EMP on impact with a hard surface. \
- From Silicons, to IPCs, to any machinery or energy-based weapons in use by security, leave them in the dark."
- item = /obj/item/ammo_box/c38/emp
- cost = 1
- purchasable_from = ~UPLINK_CLOWN_OPS
- illegal_tech = FALSE
- contents_are_illegal_tech = FALSE
-
/datum/uplink_item/ammo/a40mm
name = "40mm Grenade Box"
desc = "A box of 40mm HE grenades for use with the M-90gl's under-barrel grenade launcher. \
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"
diff --git a/html/changelog.html b/html/changelog.html
index ca4a3fc58d09e..0b4ca60c72957 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,82 @@
-->
+
08 December 2024
+
PowerfulBacon updated:
+
+ Changeling armblade buffed to 30 damage
+ Changeling armor no longer slows you down
+ Teratoma and changeling armour no longer require absorbs to use.
+ Adds a limit of 2 living teratomas to changelings.
+ Teratomas will now share DNA with the person that made them, which opens the way for detective work and changeling confusion counter-play.
+
+
+
07 December 2024
+
Geatish, dejaku51 updated:
+
+ Changling last resort now works properly
+
+
Ghommie, LemonInTheDark, Kylerace, vinylspiders, MrMelbert, Fikou, AnturK, ShizCalev, OrionTheFox, XeonMations updated:
+
+ Gravity generator now shows repair instructions on examine
+ Proper functionality for upside down gravity, and high gravity situations
+ Gravity is now event based, meaning you should have less downtime from moving into a weightless area and your gravity status changing.
+
+
PowerfulBacon updated:
+
+ Derringer now uses the highly lethal .357 rounds.
+ Removes the now pointless .38 ammo from the uplink, and removes the now-unused EMP .38 ammo.
+
+
Programs-The-Station updated:
+
+ Through Bluespace Magic, NT Engineering has removed the Shield Satellite's Deploy time.
+
+
Therealdoooc213 updated:
+
+ ERT engi's have experimental tools now
+
+
XeonMations updated:
+
+ Fixed reagent grinders being unable to juice things.
+
+
rkz, ZephyrTFA, Fikou updated:
+
+ refactored armor into subtypes.
+ rolls permeability var into armor
+ unit tests against armor application
+
+
+
06 December 2024
+
Marshmellow105 updated:
+
+ Ashwalker camp overhaul
+
+
Therealdoooc213 updated:
+
+ trashbags no longer display baguettes on worn icon
+
+
XeonMations updated:
+
+ Dionae now take 5 seconds to assimilate nymphs on the ground.
+
+
+
05 December 2024
+
Absolucy updated:
+
+ The Chat Highlights chat settings work again.
+ Readded the High Contrast chat toggle, which was accidentally removed, although still functioning (you just couldn't change it)
+ Readded the Stat Tab Mode setting, albeit just under "General" settings rather than its own "Stat Tab" area.
+
+
Absolucy, XeonMations updated:
+
+ Cluwnes can now be fixed using DNA nullifiers or genetics consoles (mutadone won't work). This will also get rid of their cursed cluwne clothing, although you will still need to fix the brain damage caused by the mutation. A variant with the old behavior that prevents normal removal is still available for admin (ab)use.
+ Cluwne clothes now drop when cured.
+
+
PowerfulBacon updated:
+
+ Turned down the volume of the heavy gunner's minigun.
+
+
04 December 2024
XeonMations updated:
@@ -897,71 +973,6 @@ rkz, Trigg, Stylemistake, Arkatos updated:
made the Select Equipment context menu command have a TGUI menu
TGUIs custom outfit creator
-
-
06 October 2024
-
BarteG44 updated:
-
- Replaces 17 reinforced walls in Meta's maintenance with normal walls
-
-
-
05 October 2024
-
ClownMoff updated:
-
- Fixes security locker in medbay outpost being the science one
- Fixes missplaced chem storage fridge on medbay protolathe room and replaces it for a preloaded one.
- Adds the missing preloaded chem storage fridge for the public in chemistry
- Fixes service maintenance door problems
- Fixes the detective not having access to the morgue
-
-
HowToLoLu updated:
-
- Removed unused variable in tonfa code
-
-
XeonMations updated:
-
- Renamed space heaters to portable thermomachines
-
-
ktlwjec updated:
-
- A sink has been installed in Boxstation kitchen.
-
-
-
04 October 2024
-
PowerfulBacon updated:
-
- Improves compilation times by ~2.3 seconds by removing unnecessary build process overhead.
- Significant code improvements on the tonfa.
- Tonfa no longer causes unconciousness or paralysis, instead using regular stamina damage.
- Tonfa's damage has been standardised to make it easier to balance.
- Tonfa leg attack causes knockdown and pushback if the target has enough stamina damage.
- Tonfa is now the same size as the baton
-
-
rkz, AMonkeyThatCodes, Kryson, Ghommie updated:
-
- Adds Ovens, a new way of cooking.
- Does mapchanges to accommodate new oven machines
- Converts cakes, pies, bread and pizza all to baking cook method.
- New sprites for pizza and some cooking ingredients
- fixes some recipes
- kitchen icon file & folder reorg
- minor repathing of knife code
-
-
-
03 October 2024
-
Therealdoooc updated:
-
- gluttony's blessing disease no longer shows a entire code string as its cure
-
-
XeonMations updated:
-
- Fixed the stunbaton's balloon alert message.
-
-
h42 updated:
-
- Nostalgic winter coats have the correct color hoods
- Re-added some sprites for the nostalgic winter coat hoods
- renamed the old cargo coat to "nostalgic cargo winter coat"
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 9d8aac6037c5d..c17ad97797eb5 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -45132,3 +45132,57 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
2024-12-04:
XeonMations:
- bugfix: Fixed food buff durations being way too long.
+2024-12-05:
+ Absolucy:
+ - bugfix: The Chat Highlights chat settings work again.
+ - bugfix: Readded the High Contrast chat toggle, which was accidentally removed,
+ although still functioning (you just couldn't change it)
+ - bugfix: Readded the Stat Tab Mode setting, albeit just under "General" settings
+ rather than its own "Stat Tab" area.
+ Absolucy, XeonMations:
+ - balance: Cluwnes can now be fixed using DNA nullifiers or genetics consoles (mutadone
+ won't work). This will also get rid of their cursed cluwne clothing, although
+ you will still need to fix the brain damage caused by the mutation. A variant
+ with the old behavior that prevents normal removal is still available for admin
+ (ab)use.
+ - tweak: Cluwne clothes now drop when cured.
+ PowerfulBacon:
+ - tweak: Turned down the volume of the heavy gunner's minigun.
+2024-12-06:
+ Marshmellow105:
+ - tweak: Ashwalker camp overhaul
+ Therealdoooc213:
+ - bugfix: trashbags no longer display baguettes on worn icon
+ XeonMations:
+ - balance: Dionae now take 5 seconds to assimilate nymphs on the ground.
+2024-12-07:
+ Geatish, dejaku51:
+ - bugfix: Changling last resort now works properly
+ Ghommie, LemonInTheDark, Kylerace, vinylspiders, MrMelbert, Fikou, AnturK, ShizCalev, OrionTheFox, XeonMations:
+ - bugfix: Gravity generator now shows repair instructions on examine
+ - rscadd: Proper functionality for upside down gravity, and high gravity situations
+ - refactor: Gravity is now event based, meaning you should have less downtime from
+ moving into a weightless area and your gravity status changing.
+ PowerfulBacon:
+ - balance: Derringer now uses the highly lethal .357 rounds.
+ - rscdel: Removes the now pointless .38 ammo from the uplink, and removes the now-unused
+ EMP .38 ammo.
+ Programs-The-Station:
+ - balance: Through Bluespace Magic, NT Engineering has removed the Shield Satellite's
+ Deploy time.
+ Therealdoooc213:
+ - tweak: ERT engi's have experimental tools now
+ XeonMations:
+ - bugfix: Fixed reagent grinders being unable to juice things.
+ rkz, ZephyrTFA, Fikou:
+ - refactor: refactored armor into subtypes.
+ - refactor: rolls permeability var into armor
+ - code_imp: unit tests against armor application
+2024-12-08:
+ PowerfulBacon:
+ - balance: Changeling armblade buffed to 30 damage
+ - balance: Changeling armor no longer slows you down
+ - balance: Teratoma and changeling armour no longer require absorbs to use.
+ - balance: Adds a limit of 2 living teratomas to changelings.
+ - balance: Teratomas will now share DNA with the person that made them, which opens
+ the way for detective work and changeling confusion counter-play.
diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi
index dc9f39b99ec45..13d032eeee32e 100644
Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ
diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi
index 6f6d3e2f2ac5e..827ca4ea93111 100644
Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ
diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.js b/tgui/packages/tgui-panel/settings/SettingsPanel.js
index 11e3f3ae17435..aadd018e406eb 100644
--- a/tgui/packages/tgui-panel/settings/SettingsPanel.js
+++ b/tgui/packages/tgui-panel/settings/SettingsPanel.js
@@ -51,7 +51,7 @@ export const SettingsPanel = (props, context) => {
};
export const SettingsGeneral = (props, context) => {
- const { theme, fontFamily, fontSize, lineHeight } = useSelector(context, selectSettings);
+ const { theme, fontFamily, highContrast, fontSize, lineHeight, statTabMode } = useSelector(context, selectSettings);
const dispatch = useDispatch(context);
const [freeFont, setFreeFont] = useLocalState(context, 'freeFont', false);
return (
@@ -133,6 +133,19 @@ export const SettingsGeneral = (props, context) => {
)}
+
+
+ dispatch(
+ updateSettings({
+ highContrast: !highContrast,
+ })
+ )
+ }>
+ Colored names
+
+
{
}
/>
+
+
+ dispatch(
+ updateSettings({
+ statTabMode: 'Scroll',
+ })
+ )
+ }
+ />
+
+ dispatch(
+ updateSettings({
+ statTabMode: 'Multiline',
+ })
+ )
+ }
+ />
+
@@ -233,7 +272,8 @@ const TextHighlightSetting = (props, context) => {
const { id, ...rest } = props;
const highlightSettingById = useSelector(context, selectHighlightSettingById);
const dispatch = useDispatch(context);
- const { enabled, highlightColor, highlightText, highlightWholeMessage, matchWord, matchCase } = highlightSettingById[id];
+ const { enabled, highlightColor, highlightText, highlightSelf, highlightWholeMessage, matchWord, matchCase } =
+ highlightSettingById[id];
return (
diff --git a/tgui/packages/tgui-panel/settings/constants.js b/tgui/packages/tgui-panel/settings/constants.js
index e56af187ba3f4..86ac41a23ebc9 100644
--- a/tgui/packages/tgui-panel/settings/constants.js
+++ b/tgui/packages/tgui-panel/settings/constants.js
@@ -18,10 +18,6 @@ export const SETTINGS_TABS = [
id: 'chatPage',
name: 'Chat Tabs',
},
- {
- id: 'statPanelpage',
- name: 'Stat Panel',
- },
];
export const FONTS_DISABLED = 'Default';