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 + + { } /> + +